# Events vidéo

La spécification vidéo de Commanders Act vous permet de définir comment un client interagit avec vos vidéos et le contenu publicitaire associé.

Cette documentation détaille les conventions et les meilleures pratiques pour l'envoi d'événements lors du suivi des vidéos. Le document clarifie la structure et la classification de ces événements, qui se répartissent en quatre catégories : `Lecture`, `Contenu`, `Annonces` et `Paramètres vidéo`.

## Lecture

Les événements de lecture sont liés à la lecture effective du contenu vidéo et suivent des informations sur le lecteur vidéo.

Par exemple, lorsqu'un client lance une vidéo sur une application, un événement Video Playback Started est envoyé avec un session\_id unique. Tous les événements ultérieurs générés à partir de cette session sont liés au même session\_id.

Si une page web comporte deux lecteurs vidéo, il y aura deux sessions distinctes et des session\_ids associés. Cependant, si deux vidéos différentes sont lues sur le même lecteur vidéo, elles seront toujours considérées comme une seule session avec deux contenus associés.

## Propriétés des événements de lecture

Tous les événements de lecture partagent les mêmes propriétés qui décrivent l'état actuel du lecteur vidéo.

Le tableau suivant répertorie en détail toutes les propriétés de cet objet d'événement de lecture :

<table><thead><tr><th width="250">Propriété</th><th width="120">Type</th><th width="101">Obligatoire</th><th>Description</th></tr></thead><tbody><tr><td><code>video_session_id</code></td><td><code>String</code></td><td><strong>Oui</strong></td><td>Un ID unique qui lie tous les événements<br>générés à partir d'une session de lecture spécifique.<br><br>Ces événements incluent les événements de lecture, de contenu et<br>d'annonce.</td></tr><tr><td><code>video_title</code></td><td><code>String</code></td><td>Non</td><td>Désigne le titre du contenu vidéo.</td></tr><tr><td><code>video_category</code></td><td><code>String</code></td><td>Non</td><td>Désigne le genre de l'actif de contenu vidéo.</td></tr><tr><td><code>publisher</code></td><td><code>String</code></td><td>Non</td><td><p>Désigne l'éditeur / créateur / auteur de</p><p>l'actif de contenu vidéo.</p></td></tr><tr><td><code>content_asset_id</code></td><td><p><code>String</code></p><p><code>Tableau [String]</code></p></td><td><strong>Oui</strong></td><td><p>ID(s) d'actif de contenu de la/ des vidéo(s) en cours de lecture ou</p><p>sur le point d'être lue(s).</p><p>Pour <code>Lecture de la vidéo commencée</code> événements, un tableau</p><p>d'ID d'actifs uniques doit être envoyé. Pour les autres</p><p>événements de lecture, un ID d'actif de contenu unique<br>au moment de l'événement doit être envoyé.</p></td></tr><tr><td><code>content_pod_id</code></td><td><p><code>String</code></p><p><code>Tableau [String]</code></p></td><td>Non</td><td><p>ID(s) de pod de contenu de la/ des vidéo(s) en cours de lecture ou</p><p>sur le point d'être lue(s).</p><p>Pour <code>Lecture de la vidéo commencée</code> événements, un tableau</p><p>d'ID de pod uniques doivent être envoyés. Pour les autres</p><p>événements de lecture, un ID de pod de contenu unique<br>associé au pod de contenu courant au<br>moment de l'événement doit être envoyé.</p></td></tr><tr><td><code>ad_asset_id</code></td><td><p><code>String</code></p><p><code>Tableau [String]</code></p></td><td>Non</td><td><p>ID(s) d'actif d'annonce de la/ des vidéo(s) en cours de lecture ou</p><p>sur le point d'être lue(s).</p><p>Pour <code>Lecture de la vidéo commencée</code> événements, un tableau</p><p>d'ID d'actifs d'annonce uniques doivent être envoyés. Pour les autres</p><p>événements de lecture, un ID d'actif d'annonce unique<br>au moment de l'événement doit être envoyé.</p></td></tr><tr><td><code>ad_pod_id</code></td><td><p><code>String</code></p><p><code>Tableau [String]</code></p></td><td>Non</td><td><p>ID(s) de pod d'annonce de la/ des vidéo(s) en cours de lecture ou</p><p>sur le point d'être lue(s).</p><p>Pour <code>Lecture de la vidéo commencée</code> événements, un tableau</p><p>d'ID de pod d'annonce uniques doivent être envoyés. Pour les autres</p><p>événements de lecture, un ID de pod de contenu unique<br>associé au pod d'annonce courant au<br>moment de l'événement doit être envoyé.</p></td></tr><tr><td><code>ad_type</code></td><td><code>String</code></td><td>Non</td><td><p>Désigne le type d'annonce diffusée au moment de</p><p>l'événement. Les valeurs peuvent être '<code>pre-roll</code>', ' <code>mid-roll</code>', ou</p><p>'<code>post-roll</code>'.</p></td></tr><tr><td><code>cursor_position</code></td><td><code>Entier</code></td><td><strong>Oui</strong></td><td>Désigne la position actuelle du curseur de lecture<br>en secondes. Elle inclut la durée de toute annonce vue.<br><br>Non requis dans <code>video_buffer_start</code> et <code>video_buffer_complete</code> événements<br><br>Si la lecture est un livestream, référez-vous à la<br>documentation de la destination concernée pour les étapes<br>sur la transmission correcte de la position du curseur de lecture.</td></tr><tr><td><code>seek_position</code></td><td><code>Entier</code></td><td>Non</td><td><p>Désigne la position du curseur de lecture vers laquelle</p><p>l'utilisateur effectue la recherche.</p><p>Applicable uniquement sur les <code>video_seek_start</code> et <code>video_seek_complete</code><br>événements. Sur <code>video_seek_complete</code> événements,</p><p>le <code>seek_position</code> doit être égal à <code>cursor_position</code>.</p></td></tr><tr><td><code>total_length</code></td><td><code>Entier</code></td><td><strong>Oui</strong></td><td><p>Désigne la durée totale de la lecture vidéo</p><p>en secondes. Inclut la durée totale de tous</p><p>le contenu et les annonces inclus dans la session.</p><p>Définir à <code>null</code> en cas de lecture en livestream.</p></td></tr><tr><td><code>bitrate</code></td><td><code>Entier</code></td><td>Non</td><td>Débit binaire de la lecture vidéo, indiqué en <code>kbps</code></td></tr><tr><td><code>framerate</code></td><td><code>Float</code></td><td>Non</td><td>Désigne la fréquence d'images moyenne de la<br>lecture vidéo en <code>fps</code>.</td></tr><tr><td><code>video_player</code></td><td><code>String</code></td><td>Non</td><td><p>Désigne le nom du lecteur vidéo utilisé pour la</p><p>lecture. Exemple : <code>youtube</code>, <code>vimeo</code>, etc.</p></td></tr><tr><td><code>sound</code></td><td><code>Entier</code></td><td>Non</td><td><p>Désigne le niveau sonore de la lecture vidéo.</p><p>L'échelle va de 0 à 100, où 0 représente muet</p><p>et 100 le volume maximum.</p></td></tr><tr><td><code>full_screen</code></td><td><code>Boolean</code></td><td>Non</td><td>Définir à <code>true</code> si la lecture est en mode plein écran.</td></tr><tr><td><code>ad_enabled</code></td><td><code>Boolean</code></td><td>Non</td><td><p>Définir à <code>false</code> si l'utilisateur utilise des bloqueurs de pub.</p><p><br>Si l'utilisateur peut voir vos annonces vidéo, il est défini sur</p><p><code>true</code>.</p></td></tr><tr><td><code>image_quality</code></td><td><code>String</code></td><td>Non</td><td>Spécifie la qualité de la vidéo.<br><br>Exemples : 'hd1080', 'highres'</td></tr><tr><td><code>interruption_method</code></td><td><code>String</code></td><td>Non</td><td><p>Pour les <code>Video Playback Interrupted</code> événements,<br>vous pouvez envoyer cette propriété indiquant comment la</p><p>lecture a été interrompue.</p><p>Quelques exemples incluent 'device_lock', 'call' et</p><p>'browser_redirect'.</p></td></tr><tr><td><code>livestream</code></td><td><code>Boolean</code></td><td>Non</td><td>Définir à <code>true</code> si la lecture est un livestream,<br>autrement définir sur <code>false</code>.</td></tr></tbody></table>

## Événements de lecture

Cette section détaille tous les événements de lecture vidéo.

Pour plus d'informations sur chacune des propriétés associées à ces événements, reportez-vous à la **Playback Event Properties** section.

### Lecture de la vidéo commencée

Cet événement est associé à l'action utilisateur d'appuyer sur le bouton de lecture du lecteur vidéo pour démarrer la lecture de la vidéo.

Un événement exemple est présenté ci-dessous :

{% tabs %}
{% tab title="JavaScript" %}

```javascript
{
    "event_name": "video_start",
    "user": {},
    "video_session_id": "98765",
    "content_asset_id": ["0133370", "123456"],
    "content_pod_id": ["CAA", "CAB", "CAD"],
    "ad_asset_id": ["ad1", "ad0", "ad2"],
    "ad_pod_id": ["adCAA", "adCAB", "adCAD"],
    "ad_type": "pre-roll",
    "cursor_position": 0,
    "total_length": 600,
    "bitrate": 128,
    "framerate": 60.00,
    "video_player": "vimeo",
    "sound": 100,
    "full_screen": false,
    "ad_enabled": false,
    "image_quality": "hd720",
    "livestream": true
}
```

{% endtab %}

{% tab title="Kotlin (Android)" %}

```kotlin
val playbackVideoEvent = TCVideoPlaybackEvent(ETCVideoPlaybackMode.video_start, "YOUR_VIDEO_SESSION_ID")
playbackVideoEvent.contentAssetID = listOf("456", "223")
playbackVideoEvent.cursorPosition = 0
playbackVideoEvent.totalLength = 500
serverSide.execute(playbackVideoEvent)
```

{% endtab %}

{% tab title="Java (Android)" %}

```java
TCVideoPlaybackEvent playbackVideoEvent = new TCVideoPlaybackEvent(ETCVideoPlaybackMode.video_start, "YOUR_VIDEO_SESSION_ID");
playbackVideoEvent.contentAssetID = Arrays.asList("456", "223");
playbackVideoEvent.cursorPosition = 0;
playbackVideoEvent.totalLength = 500;
serverSide.execute(playbackVideoEvent);
```

{% endtab %}

{% tab title="Objective-C (iOS)" %}

```objectivec
    TCVideoPlaybackEvent *playbackVideoEvent = [[TCVideoPlaybackEvent alloc] initWithMode: video_start andSessionId: @"YOUR_VIDEO_SESSION_ID"];
    playbackVideoEvent.contentAssetID =  [@[@"456", @"223"] mutableCopy];
    playbackVideoEvent.cursorPosition = [[NSDecimalNumber alloc] initWithInt: 0];
    playbackVideoEvent.totalLength = [[NSDecimalNumber alloc] initWithInt: 500];;
    [serverside execute: playbackVideoEvent];
```

{% endtab %}

{% tab title="Swift (iOS)" %}

```swift
let playbackVideoEvent = TCVideoPlaybackEvent(mode: video_start, andSessionId: "YOUR_VIDEO_SESSION_ID")
    playbackVideoEvent?.contentAssetID = ["456", "223"]
    playbackVideoEvent?.cursorPosition = 0
    playbackVideoEvent?.totalLength = 500
    serverSide?.execute(playbackVideoEvent)
```

{% endtab %}
{% endtabs %}

### Lecture de la vidéo en pause

Cet événement correspond à l'action utilisateur de mettre la lecture en pause.

Un événement exemple est présenté comme suit :

{% tabs %}
{% tab title="JavaScript" %}

```javascript
{
    "event_name": "video_pause",
    "user": {},
    "video_session_id": "98765",
    "content_asset_id": ["0123370", "123456"],
    "content_pod_id": ["CAA", "CAB", "CAD"],
    "cursor_position": 10,
    "total_length": 600,
    "bitrate": 256,
    "framerate": 60.00,
    "video_player": "vimeo",
    "sound": 100,
    "full_screen": false,
    "ad_enabled": false,
    "image_quality": "hd720",
    "livestream": true
}
```

{% endtab %}

{% tab title="Kotlin (Android)" %}

```kotlin
val playbackVideoEvent = TCVideoPlaybackEvent(ETCVideoPlaybackMode.video_pause, "YOUR_VIDEO_SESSION_ID")
playbackVideoEvent.contentAssetID = listOf("456", "223")
playbackVideoEvent.cursorPosition = 0
playbackVideoEvent.totalLength = 500
serverSide.execute(playbackVideoEvent)
```

{% endtab %}

{% tab title="Java (Android)" %}

```java
TCVideoPlaybackEvent playbackVideoEvent = new TCVideoPlaybackEvent(ETCVideoPlaybackMode.video_pause, "YOUR_VIDEO_SESSION_ID");
playbackVideoEvent.contentAssetID = Arrays.asList("456", "223");
playbackVideoEvent.cursorPosition = 0;
playbackVideoEvent.totalLength = 500;
serverSide.execute(playbackVideoEvent);
```

{% endtab %}

{% tab title="Objective-C (iOS)" %}

```objectivec
    TCVideoPlaybackEvent *playbackVideoEvent = [[TCVideoPlaybackEvent alloc] initWithMode: video_pause andSessionId: @"YOUR_VIDEO_SESSION_ID"];
    playbackVideoEvent.contentAssetID =  [@[@"456", @"223"] mutableCopy];
    playbackVideoEvent.cursorPosition = [[NSDecimalNumber alloc] initWithInt: 0];
    playbackVideoEvent.totalLength = [[NSDecimalNumber alloc] initWithInt: 500];;
    [serverside execute: playbackVideoEvent];
```

{% endtab %}

{% tab title="Swift (iOS)" %}

```swift
let playbackVideoEvent = TCVideoPlaybackEvent(mode: video_pause, andSessionId: "YOUR_VIDEO_SESSION_ID")
    playbackVideoEvent?.contentAssetID = ["456", "223"]
    playbackVideoEvent?.cursorPosition = 0
    playbackVideoEvent?.totalLength = 500
    serverSide?.execute(playbackVideoEvent)
```

{% endtab %}
{% endtabs %}

### Video Playback Interrupted

Cet événement est envoyé lorsque la lecture vidéo s'arrête de manière inattendue. Perte de réseau, fermeture du navigateur par l'utilisateur, redirection, etc. sont quelques-unes des raisons courantes. Vous pouvez transmettre la cause via la propriété `interruption_method`.

Un événement exemple est présenté comme suit :

{% tabs %}
{% tab title="JavaScript" %}

```javascript
{
    "event_name": "video_error",
    "user": {},
    "video_session_id": "12345",
    "content_asset_id": ["0144370"],
    "content_pod_id": ["CAA", "CAB"],
    "cursor_position": 0,
    "total_length": 300,
    "bitrate": 128,
    "framerate": 30.00,
    "video_player": "youtube",
    "sound": 68,
    "full_screen": true,
    "ad_enabled": true,
    "image_quality": "hd1080",
    "livestream": false,
    "interruption_method":"network_loss"
}
```

{% endtab %}

{% tab title="Kotlin (Android)" %}

```kotlin
val playbackVideoEvent = TCVideoPlaybackEvent(ETCVideoPlaybackMode.video_error, "YOUR_VIDEO_SESSION_ID")
playbackVideoEvent.contentAssetID = listOf("456", "223")
playbackVideoEvent.cursorPosition = 0
playbackVideoEvent.totalLength = 500
serverSide.execute(playbackVideoEvent)
```

{% endtab %}

{% tab title="Java (Android)" %}

```java
TCVideoPlaybackEvent playbackVideoEvent = new TCVideoPlaybackEvent(ETCVideoPlaybackMode.video_error, "YOUR_VIDEO_SESSION_ID");
playbackVideoEvent.contentAssetID = Arrays.asList("456", "223");
playbackVideoEvent.cursorPosition = 0;
playbackVideoEvent.totalLength = 500;
serverSide.execute(playbackVideoEvent);
```

{% endtab %}

{% tab title="Objective-C (iOS)" %}

```objectivec
    TCVideoPlaybackEvent *playbackVideoEvent = [[TCVideoPlaybackEvent alloc] initWithMode: video_error andSessionId: @"YOUR_VIDEO_SESSION_ID"];
    playbackVideoEvent.contentAssetID =  [@[@"456", @"223"] mutableCopy];
    playbackVideoEvent.cursorPosition = [[NSDecimalNumber alloc] initWithInt: 0];
    playbackVideoEvent.totalLength = [[NSDecimalNumber alloc] initWithInt: 500];;
    [serverside execute: playbackVideoEvent];
```

{% endtab %}

{% tab title="Swift (iOS)" %}

```swift
let playbackVideoEvent = TCVideoPlaybackEvent(mode: video_error, andSessionId: "YOUR_VIDEO_SESSION_ID")
    playbackVideoEvent?.contentAssetID = ["456", "223"]
    playbackVideoEvent?.cursorPosition = 0
    playbackVideoEvent?.totalLength = 500
    serverSide?.execute(playbackVideoEvent)
```

{% endtab %}
{% endtabs %}

### Video Playback Buffer Started

Ceci correspond à l'événement de mise en buffer du contenu ou d'une publicité.

Un événement exemple est présenté comme suit :

{% tabs %}
{% tab title="JavaScript" %}

```javascript
{
    "event_name": "video_buffer_start",
    "user": {},
    "video_session_id": "54321",
    "content_asset_id": ["098765"],
    "content_pod_id": ["CAD", "CAE"],
    "cursor_position": 10,
    "total_length": 600,
    "bitrate": 256,
    "framerate": 60.00,
    "video_player": "vimeo",
    "sound": 100,
    "full_screen": false,
    "ad_enabled": false,
    "image_quality": "hd720",
    "livestream": true
}
```

{% endtab %}

{% tab title="Kotlin (Android)" %}

```kotlin
val playbackVideoEvent = TCVideoPlaybackEvent(ETCVideoPlaybackMode.video_buffer_start, "YOUR_VIDEO_SESSION_ID")
playbackVideoEvent.contentAssetID = listOf("456", "223")
playbackVideoEvent.cursorPosition = 0
playbackVideoEvent.totalLength = 500
serverSide.execute(playbackVideoEvent)
```

{% endtab %}

{% tab title="Java (Android)" %}

```java
TCVideoPlaybackEvent playbackVideoEvent = new TCVideoPlaybackEvent(ETCVideoPlaybackMode.video_buffer_start, "YOUR_VIDEO_SESSION_ID");
playbackVideoEvent.contentAssetID = Arrays.asList("456", "223");
playbackVideoEvent.cursorPosition = 0;
playbackVideoEvent.totalLength = 500;
serverSide.execute(playbackVideoEvent);
```

{% endtab %}

{% tab title="Objective-C (iOS)" %}

```objectivec
    TCVideoPlaybackEvent *playbackVideoEvent = [[TCVideoPlaybackEvent alloc] initWithMode: video_buffer_start andSessionId: @"YOUR_VIDEO_SESSION_ID"];
    playbackVideoEvent.contentAssetID =  [@[@"456", @"223"] mutableCopy];
    playbackVideoEvent.cursorPosition = [[NSDecimalNumber alloc] initWithInt: 0];
    playbackVideoEvent.totalLength = [[NSDecimalNumber alloc] initWithInt: 500];;
    [serverside execute: playbackVideoEvent];
```

{% endtab %}

{% tab title="Swift (iOS)" %}

```swift
let playbackVideoEvent = TCVideoPlaybackEvent(mode: video_buffer_start, andSessionId: "YOUR_VIDEO_SESSION_ID")
    playbackVideoEvent?.contentAssetID = ["456", "223"]
    playbackVideoEvent?.cursorPosition = 0
    playbackVideoEvent?.totalLength = 500
    serverSide?.execute(playbackVideoEvent)
```

{% endtab %}
{% endtabs %}

### Video Playback Buffer Completed

Ceci correspond à l'événement lorsque la lecture a fini de mettre en buffer le contenu ou une publicité.

Un événement exemple est présenté comme suit :

{% tabs %}
{% tab title="JavaScript" %}

```javascript
{
    "event_name": "video_buffer_complete",
    "user": {},
    "video_session_id": "56789",
    "content_asset_id": ["123456"],
    "content_pod_id": ["CAF", "CAG"],
    "cursor_position": 20,
    "total_length": 400,
    "bitrate": 512,
    "framerate": 60.00,
    "video_player": "dailymotion",
    "sound": 100,
    "full_screen": false,
    "ad_enabled": false,
    "image_quality": "hd720",
    "livestream": true
}
```

{% endtab %}

{% tab title="Kotlin (Android)" %}

```kotlin
val playbackVideoEvent = TCVideoPlaybackEvent(ETCVideoPlaybackMode.video_buffer_complete, "YOUR_VIDEO_SESSION_ID")
playbackVideoEvent.contentAssetID = listOf("456", "223")
playbackVideoEvent.cursorPosition = 0
playbackVideoEvent.totalLength = 500
serverSide.execute(playbackVideoEvent)
```

{% endtab %}

{% tab title="Java (Android)" %}

```java
TCVideoPlaybackEvent playbackVideoEvent = new TCVideoPlaybackEvent(ETCVideoPlaybackMode.video_buffer_complete, "YOUR_VIDEO_SESSION_ID");
playbackVideoEvent.contentAssetID = Arrays.asList("456", "223");
playbackVideoEvent.cursorPosition = 0;
playbackVideoEvent.totalLength = 500;
serverSide.execute(playbackVideoEvent);
```

{% endtab %}

{% tab title="Objective-C (iOS)" %}

```objectivec
    TCVideoPlaybackEvent *playbackVideoEvent = [[TCVideoPlaybackEvent alloc] initWithMode: video_buffer_complete andSessionId: @"YOUR_VIDEO_SESSION_ID"];
    playbackVideoEvent.contentAssetID =  [@[@"456", @"223"] mutableCopy];
    playbackVideoEvent.cursorPosition = [[NSDecimalNumber alloc] initWithInt: 0];
    playbackVideoEvent.totalLength = [[NSDecimalNumber alloc] initWithInt: 500];;
    [serverside execute: playbackVideoEvent];
```

{% endtab %}

{% tab title="Swift (iOS)" %}

```swift
let playbackVideoEvent = TCVideoPlaybackEvent(mode: video_buffer_complete, andSessionId: "YOUR_VIDEO_SESSION_ID")
    playbackVideoEvent?.contentAssetID = ["456", "223"]
    playbackVideoEvent?.cursorPosition = 0
    playbackVideoEvent?.totalLength = 500
    serverSide?.execute(playbackVideoEvent)
```

{% endtab %}
{% endtabs %}

### Video Playback Seek Started

Cet événement est envoyé lorsqu'un utilisateur effectue une recherche manuelle vers une certaine position du curseur dans le contenu vidéo ou une publicité pendant la lecture. La `cursor_position` propriété indique d'où l'utilisateur effectue la recherche (temps en secondes) et la `seek_position` indique la position du curseur dans la lecture vers laquelle l'utilisateur recherche.

Un événement exemple est présenté comme suit :

{% tabs %}
{% tab title="JavaScript" %}

```javascript
{
    "event_name": "video_seek_start",
    "user": {},
    "video_session_id": "abcdef",
    "content_asset_id": ["123456"],
    "content_pod_id": ["XYZ", "XYA"],
    "cursor_position": 59,
    "seek_position": 150,
    "total_length": 360,
    "bitrate": 256,
    "framerate": 60.00,
    "video_player": "vimeo",
    "sound": 80,
    "full_screen": false,
    "ad_enabled": false,
    "image_quality": "hd720",
    "livestream": true
}
```

{% endtab %}

{% tab title="Kotlin (Android)" %}

```kotlin
val playbackVideoEvent = TCVideoPlaybackEvent(ETCVideoPlaybackMode.video_seek_start, "YOUR_VIDEO_SESSION_ID")
playbackVideoEvent.contentAssetID = listOf("456", "223")
playbackVideoEvent.cursorPosition = 0
playbackVideoEvent.totalLength = 500
serverSide.execute(playbackVideoEvent)
```

{% endtab %}

{% tab title="Java (Android)" %}

```java
TCVideoPlaybackEvent playbackVideoEvent = new TCVideoPlaybackEvent(ETCVideoPlaybackMode.video_seek_start, "YOUR_VIDEO_SESSION_ID");
playbackVideoEvent.contentAssetID = Arrays.asList("456", "223");
playbackVideoEvent.cursorPosition = 0;
playbackVideoEvent.totalLength = 500;
serverSide.execute(playbackVideoEvent);
```

{% endtab %}

{% tab title="Objective-C (iOS)" %}

```objectivec
    TCVideoPlaybackEvent *playbackVideoEvent = [[TCVideoPlaybackEvent alloc] initWithMode: video_seek_start andSessionId: @"YOUR_VIDEO_SESSION_ID"];
    playbackVideoEvent.contentAssetID =  [@[@"456", @"223"] mutableCopy];
    playbackVideoEvent.cursorPosition = [[NSDecimalNumber alloc] initWithInt: 0];
    playbackVideoEvent.totalLength = [[NSDecimalNumber alloc] initWithInt: 500];;
    [serverside execute: playbackVideoEvent];
```

{% endtab %}

{% tab title="Swift (iOS)" %}

```swift
let playbackVideoEvent = TCVideoPlaybackEvent(mode: video_seek_start, andSessionId: "YOUR_VIDEO_SESSION_ID")
    playbackVideoEvent?.contentAssetID = ["456", "223"]
    playbackVideoEvent?.cursorPosition = 0
    playbackVideoEvent?.totalLength = 500
    serverSide?.execute(playbackVideoEvent)
```

{% endtab %}
{% endtabs %}

### Video Playback Seek Completed

Cet événement est envoyé après qu'un utilisateur ait terminé une recherche manuelle vers une certaine position du curseur de la vidéo ou de l'annonce dans la lecture. La `cursor_position` propriété indique où l'utilisateur reprend la lecture.

Un événement exemple est présenté comme suit :

{% tabs %}
{% tab title="JavaScript" %}

```javascript
{
    "event_name": "video_seek_complete",
    "user": {},
    "video_session_id": "abcdef",
    "content_asset_id": ["123456"],
    "content_pod_id": ["XYZ", "XYA"],
    "cursor_position": 59,
    "seek_position": 150,
    "total_length": 360,
    "bitrate": 256,
    "framerate": 60.00,
    "video_player": "vimeo",
    "sound": 80,
    "full_screen": false,
    "ad_enabled": false,
    "image_quality": "hd720",
    "livestream": true
}
```

{% endtab %}

{% tab title="Kotlin (Android)" %}

```kotlin
val playbackVideoEvent = TCVideoPlaybackEvent(ETCVideoPlaybackMode.video_seek_complete, "YOUR_VIDEO_SESSION_ID")
playbackVideoEvent.contentAssetID = listOf("456", "223")
playbackVideoEvent.cursorPosition = 0
playbackVideoEvent.totalLength = 500
serverSide.execute(playbackVideoEvent)
```

{% endtab %}

{% tab title="Java (Android)" %}

```java
TCVideoPlaybackEvent playbackVideoEvent = new TCVideoPlaybackEvent(ETCVideoPlaybackMode.video_seek_complete, "YOUR_VIDEO_SESSION_ID");
playbackVideoEvent.contentAssetID = Arrays.asList("456", "223");
playbackVideoEvent.cursorPosition = 0;
playbackVideoEvent.totalLength = 500;
serverSide.execute(playbackVideoEvent);
```

{% endtab %}

{% tab title="Objective-C (iOS)" %}

```objectivec
    TCVideoPlaybackEvent *playbackVideoEvent = [[TCVideoPlaybackEvent alloc] initWithMode: video_seek_start andSessionId: @"YOUR_VIDEO_SESSION_ID"];
    playbackVideoEvent.contentAssetID =  [@[@"456", @"223"] mutableCopy];
    playbackVideoEvent.cursorPosition = [[NSDecimalNumber alloc] initWithInt: 0];
    playbackVideoEvent.totalLength = [[NSDecimalNumber alloc] initWithInt: 500];;
    [serverside execute: playbackVideoEvent];
```

{% endtab %}

{% tab title="Swift (iOS)" %}

```swift
let playbackVideoEvent = TCVideoPlaybackEvent(mode: video_seek_complete, andSessionId: "YOUR_VIDEO_SESSION_ID")
    playbackVideoEvent?.contentAssetID = ["456", "223"]
    playbackVideoEvent?.cursorPosition = 0
    playbackVideoEvent?.totalLength = 500
    serverSide?.execute(playbackVideoEvent)
```

{% endtab %}
{% endtabs %}

### Video Playback Resumed

Cet événement est envoyé après que l'utilisateur ait repris la lecture de la vidéo après qu'elle ait été mise en pause.

Un événement exemple est présenté comme suit :

{% tabs %}
{% tab title="JavaScript" %}

```javascript
{
    "event_name": "video_resume",
    "user": {},
    "video_session_id": "abcdef",
    "content_asset_id": ["123456"],
    "content_pod_id": ["XYZ", "XYA"],
    "cursor_position": 150,
    "total_length": 360,
    "bitrate": 256,
    "framerate": 60.00,
    "video_player": "vimeo",
    "sound": 80,
    "full_screen": false,
    "ad_enabled": false,
    "image_quality": "hd720",
    "livestream": true
}
```

{% endtab %}

{% tab title="Kotlin (Android)" %}

```kotlin
val playbackVideoEvent = TCVideoPlaybackEvent(ETCVideoPlaybackMode.video_resume, "YOUR_VIDEO_SESSION_ID")
playbackVideoEvent.contentAssetID = listOf("456", "223")
playbackVideoEvent.cursorPosition = 0
playbackVideoEvent.totalLength = 500
serverSide.execute(playbackVideoEvent)
```

{% endtab %}

{% tab title="Java (Android)" %}

```java
TCVideoPlaybackEvent playbackVideoEvent = new TCVideoPlaybackEvent(ETCVideoPlaybackMode.video_resume, "YOUR_VIDEO_SESSION_ID");
playbackVideoEvent.contentAssetID = Arrays.asList("456", "223");
playbackVideoEvent.cursorPosition = 0;
playbackVideoEvent.totalLength = 500;
serverSide.execute(playbackVideoEvent);
```

{% endtab %}

{% tab title="Objective-C (iOS)" %}

```objectivec
    TCVideoPlaybackEvent *playbackVideoEvent = [[TCVideoPlaybackEvent alloc] initWithMode: video_resume andSessionId: @"YOUR_VIDEO_SESSION_ID"];
    playbackVideoEvent.contentAssetID =  [@[@"456", @"223"] mutableCopy];
    playbackVideoEvent.cursorPosition = [[NSDecimalNumber alloc] initWithInt: 0];
    playbackVideoEvent.totalLength = [[NSDecimalNumber alloc] initWithInt: 500];;
    [serverside execute: playbackVideoEvent];
```

{% endtab %}

{% tab title="Swift (iOS)" %}

```swift
let playbackVideoEvent = TCVideoPlaybackEvent(mode: video_resume, andSessionId: "YOUR_VIDEO_SESSION_ID")
    playbackVideoEvent?.contentAssetID = ["456", "223"]
    playbackVideoEvent?.cursorPosition = 0
    playbackVideoEvent?.totalLength = 500
    serverSide?.execute(playbackVideoEvent)
```

{% endtab %}
{% endtabs %}

### Lecture de la vidéo terminée

Cet événement est envoyé après la fin de la lecture et lorsque la session de pod est terminée. Notez que la `cursor_position` propriété a la même valeur que la `total_length` propriété.

Un événement exemple est présenté comme suit :

{% tabs %}
{% tab title="JavaScript" %}

```javascript
{
    "event_name": "video_complete",
    "user": {},
    "video_session_id": "abcdef",
    "content_asset_id": ["123456"],
    "content_pod_id": ["XYZ", "XYA"],
    "cursor_position": 150,
    "total_length": 360,
    "bitrate": 256,
    "framerate": 60.00,
    "video_player": "vimeo",
    "sound": 80,
    "full_screen": false,
    "ad_enabled": false,
    "image_quality": "hd720",
    "livestream": true
}
```

{% endtab %}

{% tab title="Kotlin (Android)" %}

```kotlin
val playbackVideoEvent = TCVideoPlaybackEvent(ETCVideoPlaybackMode.video_complete, "YOUR_VIDEO_SESSION_ID")
playbackVideoEvent.contentAssetID = listOf("456", "223")
playbackVideoEvent.cursorPosition = 0
playbackVideoEvent.totalLength = 500
serverSide.execute(playbackVideoEvent)
```

{% endtab %}

{% tab title="Java (Android)" %}

```java
TCVideoPlaybackEvent playbackVideoEvent = new TCVideoPlaybackEvent(ETCVideoPlaybackMode.video_complete, "YOUR_VIDEO_SESSION_ID");
playbackVideoEvent.contentAssetID = Arrays.asList("456", "223");
playbackVideoEvent.cursorPosition = 0;
playbackVideoEvent.totalLength = 500;
serverSide.execute(playbackVideoEvent);
```

{% endtab %}

{% tab title="Objective-C (iOS)" %}

```objectivec
    TCVideoPlaybackEvent *playbackVideoEvent = [[TCVideoPlaybackEvent alloc] initWithMode: video_resume andSessionId: @"YOUR_VIDEO_SESSION_ID"];
    playbackVideoEvent.contentAssetID =  [@[@"456", @"223"] mutableCopy];
    playbackVideoEvent.cursorPosition = [[NSDecimalNumber alloc] initWithInt: 0];
    playbackVideoEvent.totalLength = [[NSDecimalNumber alloc] initWithInt: 500];;
    [serverside execute: playbackVideoEvent];
```

{% endtab %}

{% tab title="Swift (iOS)" %}

```swift
let playbackVideoEvent = TCVideoPlaybackEvent(mode: video_complete, andSessionId: "YOUR_VIDEO_SESSION_ID")
    playbackVideoEvent?.contentAssetID = ["456", "223"]
    playbackVideoEvent?.cursorPosition = 0
    playbackVideoEvent?.totalLength = 500
    serverSide?.execute(playbackVideoEvent)
```

{% endtab %}
{% endtabs %}

## Contenu

Un pod de **contenu** désigne une partie / un groupe / un segment du contenu vidéo ou de la publicité au sein de la lecture.

Supposons qu'une session de lecture vidéo comporte une vidéo et une publicité mid-roll. Cela signifie que la mid-roll divise la lecture en deux pods de contenu distincts. La mid-roll est incluse dans un seul pod d'annonce.

Le flux est le suivant :

* L'utilisateur démarre et termine le premier pod de contenu
* L'utilisateur démarre et termine l'annonce
* L'utilisateur démarre et termine le deuxième pod de contenu

Tous ces événements dans le flux se produisent au sein d'une même lecture vidéo.

## Propriétés des événements de contenu

Tous les événements de contenu partagent les mêmes propriétés qui décrivent l'état actuel du contenu vidéo visionné par l'utilisateur pendant la lecture.

Le tableau suivant répertorie en détail toutes les propriétés de cet objet d'événement de lecture :

<table><thead><tr><th width="226">Propriété</th><th width="116.33333333333331">Type</th><th width="101">Obligatoire</th><th>Description</th></tr></thead><tbody><tr><td><code>video_session_id</code></td><td><code>String</code></td><td><strong>Oui</strong></td><td>Un ID unique qui lie tous les événements<br>générés à partir d'une session de lecture spécifique.<br><br>Ces événements incluent les événements de lecture, de contenu et<br>d'annonce.</td></tr><tr><td><code>content_asset_id</code></td><td><code>String</code></td><td><strong>Oui</strong></td><td>Désigne l'ID unique de l'actif de contenu vidéo.</td></tr><tr><td><code>content_pod_id</code></td><td><code>String</code></td><td>Non</td><td>Désigne l'ID unique du pod de contenu vidéo.</td></tr><tr><td><code>video_title</code></td><td><code>String</code></td><td>Non</td><td>Désigne le titre du contenu vidéo.</td></tr><tr><td><code>video_description</code></td><td><code>String</code></td><td>Non</td><td>Décrit brièvement l'actif de contenu vidéo.</td></tr><tr><td><code>keywords</code></td><td><code>Tableau [String]</code></td><td>Non</td><td><p>Désigne les mots-clés pertinents associés à la</p><p>catégorisation du contenu vidéo</p></td></tr><tr><td><code>season</code></td><td><code>String</code></td><td>Non</td><td>Désigne le numéro de saison, si applicable.</td></tr><tr><td><code>episode</code></td><td><code>String</code></td><td>Non</td><td>Désigne le numéro d'épisode, si applicable.</td></tr><tr><td><code>video_category</code></td><td><code>String</code></td><td>Non</td><td>Désigne le genre de l'actif de contenu vidéo.</td></tr><tr><td><code>program</code></td><td><code>String</code></td><td>Non</td><td><p>Désigne le nom du programme / spectacle dont</p><p>le contenu vidéo fait partie.</p></td></tr><tr><td><code>publisher</code></td><td><code>String</code></td><td>Non</td><td><p>Désigne l'éditeur / créateur / auteur de</p><p>l'actif de contenu vidéo.</p></td></tr><tr><td><code>digital</code></td><td><code>String</code></td><td>Non</td><td><p>Désigne la chaîne dans laquelle le contenu vidéo</p><p>est diffusé.</p></td></tr><tr><td><code>full_episode</code></td><td><code>Boolean</code></td><td>Non</td><td>Définir à <code>true</code> l'actif de contenu vidéo est un épisode complet.</td></tr><tr><td><code>livestream</code></td><td>Boolean</td><td>Non</td><td><p>Si le contenu vidéo est un livestream, ceci est défini sur</p><p><code>true</code>.</p></td></tr><tr><td><code>airdate</code></td><td><p><code>ISO 8601</code></p><p><code>Date String</code></p></td><td>Non</td><td><p>Désigne la date originale de diffusion / publication</p><p>du contenu vidéo.</p></td></tr><tr><td><code>cursor_position</code></td><td><code>Entier</code></td><td><strong>Oui</strong></td><td><p>Désigne la position actuelle du curseur dans le</p><p>contenu vidéo en secondes. Cela n'inclut pas</p><p>les annonces jouées pendant cette durée.</p><p>En cas de livestreams, référez-vous à la documentation de la destination concernée pour les détails sur la façon de transmettre cette propriété.</p></td></tr><tr><td><code>total_length</code></td><td><code>Entier</code></td><td><strong>Oui</strong></td><td><p>La durée totale du contenu vidéo en</p><p>secondes. Cela n'inclut aucune annonce incluse</p><p>dans la lecture de cet actif de contenu.</p><p>Pour la lecture en livestream, cela doit être défini sur <code>null</code>.</p></td></tr><tr><td><code>bitrate</code></td><td><code>Entier</code></td><td>Non</td><td>Désigne le débit binaire actuel en <code>kbps</code>.</td></tr><tr><td><code>framerate</code></td><td><code>Float</code></td><td>Non</td><td>Désigne la fréquence d'images en <code>fps</code>.</td></tr></tbody></table>

## Événements de contenu

Cette section détaille tous les événements de contenu vidéo.

Pour plus d'informations sur chacune des propriétés associées à ces événements, reportez-vous à la [**Propriétés des événements de contenu**](#content-events-properties) section.

### Vidéo - Contenu démarré

Cet événement est envoyé une fois que l'utilisateur commence à lire un segment de contenu vidéo dans une lecture.

Un événement exemple est présenté comme suit :

{% tabs %}
{% tab title="JavaScript" %}

```javascript
{
    "event_name": "video_content_start",
    "video_session_id": "98765",
    "content_asset_id": "456",
    "content_pod_id": "XYZ",
    "program": "The Lion King",
    "video_title": "Act 1",
    "video_description": "Invented description",
    "season": "1",
    "episode":"14",
    "channel":"NBC",
    "livestream":false,
    "airdate":"2022-12-20",
    "cursor_position": 5,
    "total_length": 200,
    "video_category": "Animation",
    "publisher": "Disney",
    "full_episode": false,
    "keywords": ["lion", "savannah", "circle of life"],
    "user": {}
}
```

{% endtab %}

{% tab title="Kotlin (Android)" %}

```kotlin
val contentVideoEvent = TCVideoContentEvent(ETCVideoContentMode.video_content_start, "YOUR_VIDEO_SESSION_ID")
contentVideoEvent.contentAssetID = "456"
contentVideoEvent.cursorPosition = 0
contentVideoEvent.totalLength = 500
serverSide.execute(contentVideoEvent)
```

{% endtab %}

{% tab title="Java (Android)" %}

```java
TCVideoContentEvent contentVideoEvent = new TCVideoContentEvent(ETCVideoContentMode.video_content_start, "YOUR_VIDEO_SESSION_ID");
contentVideoEvent.contentAssetID = "456";
contentVideoEvent.cursorPosition = 0;
contentVideoEvent.totalLength = 500;
serverSide.execute(contentVideoEvent);
```

{% endtab %}

{% tab title="Objective-C (iOS)" %}

<pre class="language-objectivec"><code class="lang-objectivec"><strong>    TCVideoContentEvent *addContentEvent = [[TCVideoContentEvent alloc] initWithMode: video_content_start andSessionId: @"YOUR_VIDEO_SESSION_ID"];
</strong>    addContentEvent.contentAssetID = @"456";
    addContentEvent.cursorPosition = [[NSDecimalNumber alloc] initWithInt: 0];
    addContentEvent.totalLength = [[NSDecimalNumber alloc] initWithInt: 500];;
    [serverside execute: addContentEvent];
</code></pre>

{% endtab %}

{% tab title="Swift (iOS)" %}

```swift
let contentVideoEvent = TCVideoContentEvent(mode: video_content_start, andSessionId: "YOUR_VIDEO_SESSION_ID")
    contentVideoEvent?.contentAssetID = "456"
    contentVideoEvent?.cursorPosition = 0
    contentVideoEvent?.totalLength = 500
    serverSide?.execute(contentVideoEvent)
```

{% endtab %}
{% endtabs %}

### Contenu vidéo en lecture

Ces événements sont envoyés comme des heartbeats à intervalles réguliers pour indiquer la durée de vidéo vue par l'utilisateur, déterminée par le `cursor_position` propriété.

Un événement exemple est présenté comme suit :

{% tabs %}
{% tab title="JavaScript" %}

```javascript
{
    "event_name": "video_content_playing",
    "video_session_id": "56789",
    "content_asset_id": "789",
    "content_pod_id": "ABC",
    "program": "The Jungle Book",
    "video_title": "Act 2",
    "video_description": "Invented description",
    "season": "2",
    "cursor_position": 123,
    "total_length": 400,
    "video_category": "Adventure",
    "publisher": "Disney",
    "full_episode": false,
    "framerate": 60,
    "bitrate": 4500,
    "keywords": ["jungle", "animals", "mowgli"],
    "user": {}
}
```

{% endtab %}

{% tab title="Kotlin (Android)" %}

```kotlin
val contentVideoEvent = TCVideoContentEvent(ETCVideoContentMode.video_content_playing, "YOUR_VIDEO_SESSION_ID")
contentVideoEvent.contentAssetID = "456"
contentVideoEvent.cursorPosition = 0
contentVideoEvent.totalLength = 500
serverSide.execute(contentVideoEvent)
```

{% endtab %}

{% tab title="Java (Android)" %}

```java
TCVideoContentEvent contentVideoEvent = new TCVideoContentEvent(ETCVideoContentMode.video_content_playing, "YOUR_VIDEO_SESSION_ID");
contentVideoEvent.contentAssetID = "456";
contentVideoEvent.cursorPosition = 0;
contentVideoEvent.totalLength = 500;
serverSide.execute(contentVideoEvent);
```

{% endtab %}

{% tab title="Objective-C (iOS)" %}

```objectivec
    TCVideoContentEvent *addContentEvent = [[TCVideoContentEvent alloc] initWithMode: video_content_playing andSessionId: @"YOUR_VIDEO_SESSION_ID"];
    addContentEvent.contentAssetID = @"456";
    addContentEvent.cursorPosition = [[NSDecimalNumber alloc] initWithInt: 0];
    addContentEvent.totalLength = [[NSDecimalNumber alloc] initWithInt: 500];;
    [serverside execute: addContentEvent];
```

{% endtab %}

{% tab title="Swift (iOS)" %}

```swift
let contentVideoEvent = TCVideoContentEvent(mode: video_content_playing, andSessionId: "YOUR_VIDEO_SESSION_ID")
    contentVideoEvent?.contentAssetID = "456"
    contentVideoEvent?.cursorPosition = 0
    contentVideoEvent?.totalLength = 500
    serverSide?.execute(contentVideoEvent)
```

{% endtab %}
{% endtabs %}

### Contenu vidéo - Quart atteint

Ces événements sont envoyés lorsqu'un quart de la vidéo est atteint, déterminé par le `cursor_position` propriété.

Un événement exemple est présenté comme suit :

{% tabs %}
{% tab title="JavaScript" %}

```javascript
{
    "event_name": "video_content_quarter_reached",
    "video_session_id": "56789",
    "content_asset_id": "789",
    "content_pod_id": "ABC",
    "program": "The Jungle Book",
    "video_title": "Act 2",
    "video_description": "Invented description",
    "season": "2",
    "cursor_position": 123,
    "total_length": 400,
    "video_category": "Adventure",
    "publisher": "Disney",
    "full_episode": false,
    "keywords": ["jungle", "animals", "mowgli"],
    "user": {}
}
```

{% endtab %}

{% tab title="Kotlin (Android)" %}

```kotlin
val contentVideoEvent = TCVideoContentEvent(ETCVideoContentMode.video_content_quarter_reached, "YOUR_VIDEO_SESSION_ID")
contentVideoEvent.contentAssetID = "456"
contentVideoEvent.cursorPosition = 0
contentVideoEvent.totalLength = 500
serverSide.execute(contentVideoEvent)
```

{% endtab %}

{% tab title="Java (Android)" %}

```java
TCVideoContentEvent contentVideoEvent = new TCVideoContentEvent(ETCVideoContentMode.video_content_playing, "YOUR_VIDEO_SESSION_ID");
contentVideoEvent.contentAssetID = "456";
contentVideoEvent.cursorPosition = 0;
contentVideoEvent.totalLength = 500;
serverSide.execute(contentVideoEvent);
```

{% endtab %}

{% tab title="Objective-C (iOS)" %}

```objectivec
    TCVideoContentEvent *addContentEvent = [[TCVideoContentEvent alloc] initWithMode: video_content_quarter_reached andSessionId: @"YOUR_VIDEO_SESSION_ID"];
    addContentEvent.contentAssetID = @"456";
    addContentEvent.cursorPosition = [[NSDecimalNumber alloc] initWithInt: 0];
    addContentEvent.totalLength = [[NSDecimalNumber alloc] initWithInt: 500];;
    [serverside execute: addContentEvent];
```

{% endtab %}

{% tab title="Swift (iOS)" %}

```swift
let contentVideoEvent = TCVideoContentEvent(mode: video_content_quarter_reached, andSessionId: "YOUR_VIDEO_SESSION_ID")
    contentVideoEvent?.contentAssetID = "456"
    contentVideoEvent?.cursorPosition = 0
    contentVideoEvent?.totalLength = 500
    serverSide?.execute(contentVideoEvent)
```

{% endtab %}
{% endtabs %}

### Contenu vidéo - Terminé

Cet événement est envoyé une fois que le segment vidéo dans la lecture est terminé. Notez que le `cursor_position` propriété a la même valeur que la `total_length` propriété.

Un événement exemple est présenté comme suit :

{% tabs %}
{% tab title="JavaScript" %}

```javascript
{
    "event_name": "video_content_complete",
    "video_session_id": "01234",
    "content_asset_id": "111",
    "content_pod_id": "DEF",
    "program": "Tarzan",
    "video_title": "Finale",
    "video_description": "Invented description",
    "season": "4",
    "cursor_position": 300,
    "total_length": 300,
    "video_category": "Adventure",
    "publisher": "Disney",
    "full_episode": true,
    "keywords": ["jungle", "apes", "tarzan"],
    "user": {}
}
```

{% endtab %}

{% tab title="Kotlin (Android)" %}

```kotlin
val contentVideoEvent = TCVideoContentEvent(ETCVideoContentMode.video_content_complete, "YOUR_VIDEO_SESSION_ID")
contentVideoEvent.contentAssetID = "456"
contentVideoEvent.cursorPosition = 0
contentVideoEvent.totalLength = 500
serverSide.execute(contentVideoEvent)
```

{% endtab %}

{% tab title="Java (Android)" %}

```java
TCVideoContentEvent contentVideoEvent = new TCVideoContentEvent(ETCVideoContentMode.video_content_complete, "YOUR_VIDEO_SESSION_ID");
contentVideoEvent.contentAssetID = "456";
contentVideoEvent.cursorPosition = 0;
contentVideoEvent.totalLength = 500;
serverSide.execute(contentVideoEvent);
```

{% endtab %}

{% tab title="Objective-C (iOS)" %}

```objectivec
    TCVideoContentEvent *addContentEvent = [[TCVideoContentEvent alloc] initWithMode: video_content_complete andSessionId: @"YOUR_VIDEO_SESSION_ID"];
    addContentEvent.contentAssetID = @"456";
    addContentEvent.cursorPosition = [[NSDecimalNumber alloc] initWithInt: 0];
    addContentEvent.totalLength = [[NSDecimalNumber alloc] initWithInt: 500];;
    [serverside execute: addContentEvent];
```

{% endtab %}

{% tab title="Swift (iOS)" %}

```swift
let contentVideoEvent = TCVideoContentEvent(mode: video_content_complete, andSessionId: "YOUR_VIDEO_SESSION_ID")
    contentVideoEvent?.contentAssetID = "456"
    contentVideoEvent?.cursorPosition = 0
    contentVideoEvent?.totalLength = 500
    serverSide?.execute(contentVideoEvent)
```

{% endtab %}
{% endtabs %}

## Annonces

## Propriétés des événements d'annonce

Tous les événements d'annonce partagent les mêmes propriétés qui décrivent l'état actuel du contenu publicitaire vidéo avec lequel un utilisateur interagit pendant la lecture.

Le tableau suivant répertorie en détail toutes les propriétés de cet objet d'événement d'annonce :

<table><thead><tr><th width="211">Propriété</th><th width="113.33333333333331">Type</th><th width="111">Obligatoire</th><th>Description</th></tr></thead><tbody><tr><td><code>video_session_id</code></td><td><code>String</code></td><td><strong>Oui</strong></td><td>Un ID unique qui lie tous les événements<br>générés à partir d'une session de lecture spécifique.<br><br>Ces événements incluent les événements de lecture, de contenu et<br>d'annonce.</td></tr><tr><td><code>ad_asset_id</code></td><td><code>String</code></td><td><strong>Oui</strong></td><td>Désigne l'ID unique de l'actif d'annonce.</td></tr><tr><td><code>ad_pod_id</code></td><td><code>String</code></td><td><strong>Oui</strong></td><td>Désigne l'ID unique du pod d'annonce.</td></tr><tr><td><code>pod_position</code></td><td><code>Entier</code></td><td>Non</td><td><p>Désigne la position de l'actif d'annonce par rapport</p><p>aux autres annonces dans le même pod.</p></td></tr><tr><td><code>ad_type</code></td><td><code>String</code></td><td>Non</td><td><p>Désigne le type d'annonce diffusée au moment de</p><p>l'événement. Les valeurs peuvent être '<code>pre-roll</code>', ' <code>mid-roll</code>', ou</p><p>'<code>post-roll</code>'.</p></td></tr><tr><td><code>pod_length</code></td><td><code>Entier</code></td><td>Non</td><td><p>Désigne le nombre d'actifs d'annonce dans le</p><p>pod d'annonce courant.</p></td></tr><tr><td><code>video_title</code></td><td><code>String</code></td><td>Non</td><td>Désigne le titre de l'annonce.</td></tr><tr><td><code>publisher</code></td><td><code>String</code></td><td>Non</td><td>Désigne l'auteur / créateur / éditeur de l'annonce.</td></tr><tr><td><code>cursor_position</code></td><td><code>Entier</code></td><td><strong>Oui</strong></td><td><p>La position actuelle du curseur par rapport à la</p><p>durée totale de l'annonce, en secondes.</p></td></tr><tr><td><code>total_length</code></td><td><code>Entier</code></td><td><strong>Oui</strong></td><td>Désigne la durée totale de l'actif d'annonce en secondes.</td></tr><tr><td><code>load_type</code></td><td><code>Enum</code></td><td>Non</td><td><p>Désigne si les annonces sont chargées dynamiquement ou si</p><p>elles sont identiques pour tous les utilisateurs.<br><br>Les valeurs peuvent être soit '<code>dynamique</code>' soit ' <code>linear</code> '.</p></td></tr><tr><td><code>ad_quartile</code></td><td><code>Entier</code></td><td>Non</td><td><p>Pour les <code>Annonce vidéo en lecture</code> événement, cette propriété</p><p>peut être utilisée pour indiquer quand un quart spécifique de l'annonce</p><p>est atteint.</p><p>Si vous utilisez une bibliothèque client-side pour suivre vos</p><p>événements vidéo, cette propriété est optionnelle car Commanders Act</p><p>suit automatiquement les quartiles d'annonce.</p></td></tr></tbody></table>

## Événements d'annonce

Cette section détaille tous les événements d'annonce.

Pour plus d'informations sur chacune des propriétés associées à ces événements, reportez-vous à la **Propriétés des événements d'annonce** section.

### Annonce vidéo démarrée

Cet événement est envoyé lorsqu'une série d'annonces commence à être lue dans la lecture vidéo.

Un événement exemple est présenté comme suit :

{% tabs %}
{% tab title="JavaScript" %}

```javascript
{
  "event_name": "video_ad_start",
  "user": {},
  "video_session_id": "abcdef",
  "ad_asset_id": "456",
  "ad_pod_id": "XYA",
  "ad_type": "pre-roll",
  "video_title": "SmackDown!",
  "cursor_position": 0,
  "total_length": 30,
  "publisher": "WWE",
  "load_type": "linear"
}
```

{% endtab %}

{% tab title="Kotlin (Android)" %}

```kotlin
val addVideoEvent = TCVideoAdEvent(ETCVideoAdMode.video_ad_start, "YOUR_VIDEO_SESSION_ID")
addVideoEvent.adAssetID = "456"
addVideoEvent.adPodID = "839"
addVideoEvent.cursorPosition = 12
addVideoEvent.totalLength = 211
serverSide.execute(addVideoEvent)
```

{% endtab %}

{% tab title="Java (Android)" %}

```java
TCVideoAdEvent addVideoEvent = new TCVideoAdEvent(ETCVideoAdMode.video_ad_start, "YOUR_VIDEO_SESSION_ID");
addVideoEvent.adAssetID = "456";
addVideoEvent.adPodID = "839";
addVideoEvent.cursorPosition = 12;
addVideoEvent.totalLength = 211;
serverSide.execute(addVideoEvent);
```

{% endtab %}

{% tab title="Objective-C (iOS)" %}

```objectivec
    TCVideoAdEvent *addVideoEvent = [[TCVideoAdEvent alloc] initWithMode: video_ad_start andSessionId: @"YOUR_VIDEO_SESSION_ID"];
    addVideoEvent.adAssetID = @"456";
    addVideoEvent.adPodID = @"839";
    addVideoEvent.cursorPosition = [[NSDecimalNumber alloc] initWithInt: 12];
    addVideoEvent.totalLength = [[NSDecimalNumber alloc] initWithInt: 211];
    [serverside execute: addVideoEvent];
```

{% endtab %}

{% tab title="Swift (iOS)" %}

```swift
let addVideoEvent = TCVideoAdEvent(mode: video_ad_start, andSessionId: "YOUR_VIDEO_SESSION_ID")
    addVideoEvent?.adAssetID = "456"
    addVideoEvent?.adPodID = "839"
    addVideoEvent?.cursorPosition = 12
    addVideoEvent?.totalLength = 211
    serverSide?.execute(addVideoEvent)
```

{% endtab %}
{% endtabs %}

### Annonce vidéo en lecture

Cet événement est envoyé à intervalles définis pendant la lecture de l'annonce vidéo et est déterminé par le `cursor_position` propriété.

Un événement exemple est présenté comme suit :

{% tabs %}
{% tab title="JavaScript" %}

```javascript
{
  "event_name": "video_ad_playing",
  "user": {},
  "video_session_id": "abcdef",
  "ad_asset_id": "456",
  "ad_pod_id": "XYA",
  "ad_type": "pre-roll",
  "video_title": "SmackDown!",
  "cursor_position": 10,
  "total_length": 30,
  "publisher": "WWE",
  "load_type": "linear"
}
```

{% endtab %}

{% tab title="Kotlin (Android)" %}

```kotlin
val addVideoEvent = TCVideoAdEvent(ETCVideoAdMode.video_ad_playing, "YOUR_VIDEO_SESSION_ID")
addVideoEvent.adAssetID = "456"
addVideoEvent.adPodID = "839"
addVideoEvent.cursorPosition = 12
addVideoEvent.totalLength = 211
serverSide.execute(addVideoEvent)
```

{% endtab %}

{% tab title="Java (Android)" %}

```java
TCVideoAdEvent addVideoEvent = new TCVideoAdEvent(ETCVideoAdMode.video_ad_playing, "YOUR_VIDEO_SESSION_ID");
addVideoEvent.adAssetID = "456";
addVideoEvent.adPodID = "839";
addVideoEvent.cursorPosition = 12;
addVideoEvent.totalLength = 211;
serverSide.execute(addVideoEvent);
```

{% endtab %}

{% tab title="Objective-C (iOS)" %}

```objectivec
    TCVideoAdEvent *addVideoEvent = [[TCVideoAdEvent alloc] initWithMode: video_ad_playing andSessionId: @"YOUR_VIDEO_SESSION_ID"];
    addVideoEvent.adAssetID = @"456";
    addVideoEvent.adPodID = @"839";
    addVideoEvent.cursorPosition = [[NSDecimalNumber alloc] initWithInt: 12];
    addVideoEvent.totalLength = [[NSDecimalNumber alloc] initWithInt: 211];
    [serverside execute: addVideoEvent];
```

{% endtab %}

{% tab title="Swift (iOS)" %}

```swift
let addVideoEvent = TCVideoAdEvent(mode: video_ad_playing, andSessionId: "YOUR_VIDEO_SESSION_ID")
    addVideoEvent?.adAssetID = "456"
    addVideoEvent?.adPodID = "839"
    addVideoEvent?.cursorPosition = 12
    addVideoEvent?.totalLength = 211
    serverSide?.execute(addVideoEvent)
```

{% endtab %}
{% endtabs %}

### Annonce vidéo arrêtée

Cet événement est envoyé après que l'utilisateur a visionné complètement une annonce vidéo. Notez que le `cursor_position` propriété a la même valeur que la `total_length` propriété.

{% tabs %}
{% tab title="JavaScript" %}

```javascript
{
  "event_name": "video_ad_stop",
  "user": {},
  "video_session_id": "abcdef",
  "ad_asset_id": "456",
  "ad_pod_id": "XYA",
  "ad_type": "pre-roll",
  "video_title": "SmackDown!",
  "cursor_position": 30,
  "total_length": 30,
  "publisher": "WWE",
  "load_type": "linear"
}
```

{% endtab %}

{% tab title="Kotlin (Android)" %}

```kotlin
val addVideoEvent = TCVideoAdEvent(ETCVideoAdMode.video_ad_stop, "YOUR_VIDEO_SESSION_ID")
addVideoEvent.adAssetID = "456"
addVideoEvent.adPodID = "839"
addVideoEvent.cursorPosition = 12
addVideoEvent.totalLength = 211
serverSide.execute(addVideoEvent)
```

{% endtab %}

{% tab title="Java (Android)" %}

```java
TCVideoAdEvent addVideoEvent = new TCVideoAdEvent(ETCVideoAdMode.video_ad_stop, "YOUR_VIDEO_SESSION_ID");
addVideoEvent.adAssetID = "456";
addVideoEvent.adPodID = "839";
addVideoEvent.cursorPosition = 12;
addVideoEvent.totalLength = 211;
serverSide.execute(addVideoEvent);
```

{% endtab %}

{% tab title="Objective-C (iOS)" %}

```objectivec
    TCVideoAdEvent *addVideoEvent = [[TCVideoAdEvent alloc] initWithMode: video_ad_stop andSessionId: @"YOUR_VIDEO_SESSION_ID"];
    addVideoEvent.adAssetID = @"456";
    addVideoEvent.adPodID = @"839";
    addVideoEvent.cursorPosition = [[NSDecimalNumber alloc] initWithInt: 12];
    addVideoEvent.totalLength = [[NSDecimalNumber alloc] initWithInt: 211];
    [serverside execute: addVideoEvent];
```

{% endtab %}

{% tab title="Swift (iOS)" %}

```swift
let addVideoEvent = TCVideoAdEvent(mode: video_ad_playing, andSessionId: "YOUR_VIDEO_SESSION_ID")
    addVideoEvent?.adAssetID = "456"
    addVideoEvent?.adPodID = "839"
    addVideoEvent?.cursorPosition = 12
    addVideoEvent?.totalLength = 211
    serverSide?.execute(addVideoEvent)
```

{% endtab %}
{% endtabs %}

### Annonce vidéo terminée

Cet événement est envoyé après que l'utilisateur a entièrement regardé la publicité vidéo. Notez que le `cursor_position` propriété a la même valeur que la `total_length` propriété.

{% tabs %}
{% tab title="JavaScript" %}

```javascript
{
  "event_name": "video_ad_complete",
  "user": {},
  "video_session_id": "abcdef",
  "ad_asset_id": "456",
  "ad_pod_id": "XYA",
  "ad_type": "pre-roll",
  "video_title": "SmackDown!",
  "cursor_position": 30,
  "total_length": 30,
  "publisher": "WWE",
  "load_type": "linear"
}
```

{% endtab %}

{% tab title="Kotlin (Android)" %}

```kotlin
val addVideoEvent = TCVideoAdEvent(ETCVideoAdMode.video_ad_complete, "YOUR_VIDEO_SESSION_ID")
addVideoEvent.adAssetID = "456"
addVideoEvent.adPodID = "839"
addVideoEvent.cursorPosition = 12
addVideoEvent.totalLength = 211
serverSide.execute(addVideoEvent)
```

{% endtab %}

{% tab title="Java (Android)" %}

```java
TCVideoAdEvent addVideoEvent = new TCVideoAdEvent(ETCVideoAdMode.video_ad_complete, "YOUR_VIDEO_SESSION_ID");
addVideoEvent.adAssetID = "456";
addVideoEvent.adPodID = "839";
addVideoEvent.cursorPosition = 12;
addVideoEvent.totalLength = 211;
serverSide.execute(addVideoEvent);
```

{% endtab %}

{% tab title="Objective-C (iOS)" %}

```objectivec
    TCVideoAdEvent *addVideoEvent = [[TCVideoAdEvent alloc] initWithMode: video_ad_complete andSessionId: @"YOUR_VIDEO_SESSION_ID"];
    addVideoEvent.adAssetID = @"456";
    addVideoEvent.adPodID = @"839";
    addVideoEvent.cursorPosition = [[NSDecimalNumber alloc] initWithInt: 12];
    addVideoEvent.totalLength = [[NSDecimalNumber alloc] initWithInt: 211];
    [serverside execute: addVideoEvent];
```

{% endtab %}

{% tab title="Swift (iOS)" %}

```swift
let addVideoEvent = TCVideoAdEvent(mode: video_ad_complete, andSessionId: "YOUR_VIDEO_SESSION_ID")
    addVideoEvent?.adAssetID = "456"
    addVideoEvent?.adPodID = "839"
    addVideoEvent?.cursorPosition = 12
    addVideoEvent?.totalLength = 211
    serverSide?.execute(addVideoEvent)
```

{% endtab %}
{% endtabs %}

### Saut de publicité vidéo

Cet événement est envoyé lorsque l'utilisateur clique sur le bouton skip ad.

{% tabs %}
{% tab title="JavaScript" %}

```javascript
{
  "event_name": "video_ad_skip",
  "user": {},
  "video_session_id": "abcdef",
  "ad_asset_id": "456",
  "ad_pod_id": "XYA",
  "ad_type": "pre-roll",
  "video_title": "SmackDown!",
  "cursor_position": 20,
  "total_length": 30,
  "publisher": "WWE",
  "load_type": "linear"
}
```

{% endtab %}

{% tab title="Kotlin (Android)" %}

```kotlin
val addVideoEvent = TCVideoAdEvent(ETCVideoAdMode.video_ad_skip, "YOUR_VIDEO_SESSION_ID")
addVideoEvent.adAssetID = "456"
addVideoEvent.adPodID = "839"
addVideoEvent.cursorPosition = 12
addVideoEvent.totalLength = 211
serverSide.execute(addVideoEvent)
```

{% endtab %}

{% tab title="Java (Android)" %}

```java
TCVideoAdEvent addVideoEvent = new TCVideoAdEvent(ETCVideoAdMode.video_ad_skip, "YOUR_VIDEO_SESSION_ID");
addVideoEvent.adAssetID = "456";
addVideoEvent.adPodID = "839";
addVideoEvent.cursorPosition = 12;
addVideoEvent.totalLength = 211;
serverSide.execute(addVideoEvent);
```

{% endtab %}

{% tab title="Objective-C (iOS)" %}

```objectivec
    TCVideoAdEvent *addVideoEvent = [[TCVideoAdEvent alloc] initWithMode: video_ad_skip andSessionId: @"YOUR_VIDEO_SESSION_ID"];
    addVideoEvent.adAssetID = @"456";
    addVideoEvent.adPodID = @"839";
    addVideoEvent.cursorPosition = [[NSDecimalNumber alloc] initWithInt: 12];
    addVideoEvent.totalLength = [[NSDecimalNumber alloc] initWithInt: 211];
    [serverside execute: addVideoEvent];
```

{% endtab %}

{% tab title="Swift (iOS)" %}

```swift
let addVideoEvent = TCVideoAdEvent(mode: video_ad_skip, andSessionId: "YOUR_VIDEO_SESSION_ID")
    addVideoEvent?.adAssetID = "456"
    addVideoEvent?.adPodID = "839"
    addVideoEvent?.cursorPosition = 12
    addVideoEvent?.totalLength = 211
    serverSide?.execute(addVideoEvent)
```

{% endtab %}
{% endtabs %}

### Début de la pause publicitaire vidéo

Cet événement est envoyé lorsqu'une pause publicitaire commence à être lue pendant la lecture de la vidéo.

Un événement exemple est présenté comme suit :

{% tabs %}
{% tab title="JavaScript" %}

```javascript
{
  "event_name": "video_ad_break_start",
  "user": {},
  "video_session_id": "abcdef",
  "ad_asset_id": "456",
  "ad_pod_id": "XYA",
  "ad_type": "pre-roll",
  "video_title": "SmackDown!",
  "cursor_position": 0,
  "total_length": 30,
  "publisher": "WWE",
  "load_type": "linear"
}
```

{% endtab %}

{% tab title="Kotlin (Android)" %}

```kotlin
val addVideoEvent = TCVideoAdEvent(ETCVideoAdMode.video_ad_break_start, "YOUR_VIDEO_SESSION_ID")
addVideoEvent.adAssetID = "456"
addVideoEvent.adPodID = "839"
addVideoEvent.cursorPosition = 12
addVideoEvent.totalLength = 211
serverSide.execute(addVideoEvent)
```

{% endtab %}

{% tab title="Java (Android)" %}

```java
TCVideoAdEvent addVideoEvent = new TCVideoAdEvent(ETCVideoAdMode.video_ad_break_start, "YOUR_VIDEO_SESSION_ID");
addVideoEvent.adAssetID = "456";
addVideoEvent.adPodID = "839";
addVideoEvent.cursorPosition = 12;
addVideoEvent.totalLength = 211;
serverSide.execute(addVideoEvent);
```

{% endtab %}

{% tab title="Objective-C (iOS)" %}

```objectivec
    TCVideoAdEvent *addVideoEvent = [[TCVideoAdEvent alloc] initWithMode: video_ad_break_start andSessionId: @"YOUR_VIDEO_SESSION_ID"];
    addVideoEvent.adAssetID = @"456";
    addVideoEvent.adPodID = @"839";
    addVideoEvent.cursorPosition = [[NSDecimalNumber alloc] initWithInt: 12];
    addVideoEvent.totalLength = [[NSDecimalNumber alloc] initWithInt: 211];
    [serverside execute: addVideoEvent];
```

{% endtab %}

{% tab title="Swift (iOS)" %}

```swift
let addVideoEvent = TCVideoAdEvent(mode: video_ad_break_start, andSessionId: "YOUR_VIDEO_SESSION_ID")
    addVideoEvent?.adAssetID = "456"
    addVideoEvent?.adPodID = "839"
    addVideoEvent?.cursorPosition = 12
    addVideoEvent?.totalLength = 211
    serverSide?.execute(addVideoEvent)
```

{% endtab %}
{% endtabs %}

### Fin de la pause publicitaire vidéo

Cet événement est envoyé après que l'utilisateur a entièrement regardé le pod de publicité vidéo. Notez que le `cursor_position` propriété a la même valeur que la `total_length` propriété.

{% tabs %}
{% tab title="JavaScript" %}

```javascript
{
  "event_name": "video_ad_break_complete",
  "user": {},
  "video_session_id": "abcdef",
  "ad_asset_id": "456",
  "ad_pod_id": "XYA",
  "ad_type": "pre-roll",
  "video_title": "SmackDown!",
  "cursor_position": 30,
  "total_length": 30,
  "publisher": "WWE",
  "load_type": "linear"
}
```

{% endtab %}

{% tab title="Kotlin (Android)" %}

```kotlin
val addVideoEvent = TCVideoAdEvent(ETCVideoAdMode.video_ad_break_complete, "YOUR_VIDEO_SESSION_ID")
addVideoEvent.adAssetID = "456"
addVideoEvent.adPodID = "839"
addVideoEvent.cursorPosition = 12
addVideoEvent.totalLength = 211
serverSide.execute(addVideoEvent)
```

{% endtab %}

{% tab title="Java (Android)" %}

```java
TCVideoAdEvent addVideoEvent = new TCVideoAdEvent(ETCVideoAdMode.video_ad_break_complete, "YOUR_VIDEO_SESSION_ID");
addVideoEvent.adAssetID = "456";
addVideoEvent.adPodID = "839";
addVideoEvent.cursorPosition = 12;
addVideoEvent.totalLength = 211;
serverSide.execute(addVideoEvent);
```

{% endtab %}

{% tab title="Objective-C (iOS)" %}

```objectivec
    TCVideoAdEvent *addVideoEvent = [[TCVideoAdEvent alloc] initWithMode: video_ad_break_complete andSessionId: @"YOUR_VIDEO_SESSION_ID"];
    addVideoEvent.adAssetID = @"456";
    addVideoEvent.adPodID = @"839";
    addVideoEvent.cursorPosition = [[NSDecimalNumber alloc] initWithInt: 12];
    addVideoEvent.totalLength = [[NSDecimalNumber alloc] initWithInt: 211];
    [serverside execute: addVideoEvent];
```

{% endtab %}

{% tab title="Swift (iOS)" %}

```swift
let addVideoEvent = TCVideoAdEvent(mode: video_ad_break_complete, andSessionId: "YOUR_VIDEO_SESSION_ID")
    addVideoEvent?.adAssetID = "456"
    addVideoEvent?.adPodID = "839"
    addVideoEvent?.cursorPosition = 12
    addVideoEvent?.totalLength = 211
    serverSide?.execute(addVideoEvent)
```

{% endtab %}
{% endtabs %}

### Clic sur la publicité vidéo

Cet événement est envoyé lorsque l'utilisateur clique sur la add.

{% tabs %}
{% tab title="JavaScript" %}

```javascript
{
  "event_name": "video_ad_click",
  "user": {},
  "video_session_id": "abcdef",
  "ad_asset_id": "456",
  "ad_pod_id": "XYA",
  "ad_type": "pre-roll",
  "video_title": "SmackDown!",
  "cursor_position": 20,
  "total_length": 30,
  "publisher": "WWE",
  "load_type": "linear"
}
```

{% endtab %}

{% tab title="Kotlin (Android)" %}

```kotlin
val addVideoEvent = TCVideoAdEvent(ETCVideoAdMode.video_ad_click, "YOUR_VIDEO_SESSION_ID")
addVideoEvent.adAssetID = "456"
addVideoEvent.adPodID = "839"
addVideoEvent.cursorPosition = 12
addVideoEvent.totalLength = 211
serverSide.execute(addVideoEvent)
```

{% endtab %}

{% tab title="Java (Android)" %}

```java
TCVideoAdEvent addVideoEvent = new TCVideoAdEvent(ETCVideoAdMode.video_ad_click, "YOUR_VIDEO_SESSION_ID");
addVideoEvent.adAssetID = "456";
addVideoEvent.adPodID = "839";
addVideoEvent.cursorPosition = 12;
addVideoEvent.totalLength = 211;
serverSide.execute(addVideoEvent);
```

{% endtab %}

{% tab title="Objective-C (iOS)" %}

```objectivec
    TCVideoAdEvent *addVideoEvent = [[TCVideoAdEvent alloc] initWithMode: video_ad_click andSessionId: @"YOUR_VIDEO_SESSION_ID"];
    addVideoEvent.adAssetID = @"456";
    addVideoEvent.adPodID = @"839";
    addVideoEvent.cursorPosition = [[NSDecimalNumber alloc] initWithInt: 12];
    addVideoEvent.totalLength = [[NSDecimalNumber alloc] initWithInt: 211];
    [serverside execute: addVideoEvent];
```

{% endtab %}

{% tab title="Swift (iOS)" %}

```swift
let addVideoEvent = TCVideoAdEvent(mode: video_ad_click, andSessionId: "YOUR_VIDEO_SESSION_ID")
    addVideoEvent?.adAssetID = "456"
    addVideoEvent?.adPodID = "839"
    addVideoEvent?.cursorPosition = 12
    addVideoEvent?.totalLength = 211
    serverSide?.execute(addVideoEvent)
```

{% endtab %}
{% endtabs %}

## Settings

## Définition des propriétés des événements

Tous les événements de paramètres partagent les mêmes propriétés qui décrivent l'état actuel du contenu vidéo avec lequel un utilisateur interagit pendant la lecture.

<table><thead><tr><th width="220">Propriété</th><th width="152.33333333333331">Type</th><th width="128">Obligatoire</th><th>Description</th></tr></thead><tbody><tr><td><code>video_session_id</code></td><td><code>String</code></td><td><strong>Oui</strong></td><td>Un ID unique qui lie tous les événements<br>générés à partir d'une session de lecture spécifique.<br><br>Ces événements incluent les événements de lecture, de contenu et<br>d'annonce.</td></tr><tr><td><code>content_asset_id</code></td><td><code>String</code></td><td><strong>Oui</strong></td><td>Désigne l'ID unique de l'actif de contenu vidéo.</td></tr><tr><td><code>content_pod_id</code></td><td><code>String</code></td><td>Non</td><td>Désigne l'ID unique du pod de contenu vidéo.</td></tr><tr><td><code>ad_asset_id</code></td><td><code>String</code></td><td>Non</td><td>Désigne l'ID unique de l'actif d'annonce.</td></tr><tr><td><code>ad_pod_id</code></td><td><code>String</code></td><td>Non</td><td>Désigne l'ID unique du pod d'annonce.</td></tr><tr><td><code>ad_type</code></td><td><code>String</code></td><td>Non</td><td><p>Désigne le type d'annonce diffusée au moment de</p><p>l'événement. Les valeurs peuvent être '<code>pre-roll</code>', ' <code>mid-roll</code>', ou</p><p>'<code>post-roll</code>'.</p></td></tr><tr><td><code>video_title</code></td><td><code>String</code></td><td>Non</td><td>Désigne le titre du contenu vidéo.</td></tr><tr><td><code>video_description</code></td><td><code>String</code></td><td>Non</td><td>Décrit brièvement l'actif de contenu vidéo.</td></tr><tr><td><code>keywords</code></td><td><code>Tableau [String]</code></td><td>Non</td><td><p>Désigne les mots-clés pertinents associés à la</p><p>catégorisation du contenu vidéo</p></td></tr><tr><td><code>season</code></td><td><code>String</code></td><td>Non</td><td>Désigne le numéro de saison, si applicable.</td></tr><tr><td><code>episode</code></td><td><code>String</code></td><td>Non</td><td>Désigne le numéro d'épisode, si applicable.</td></tr><tr><td><code>video_category</code></td><td><code>String</code></td><td>Non</td><td>Désigne le genre de l'actif de contenu vidéo.</td></tr><tr><td><code>program</code></td><td><code>String</code></td><td>Non</td><td><p>Désigne le nom du programme / spectacle dont</p><p>le contenu vidéo fait partie.</p></td></tr><tr><td><code>publisher</code></td><td><code>String</code></td><td>Non</td><td><p>Désigne l'éditeur / créateur / auteur de</p><p>l'actif de contenu vidéo.</p></td></tr><tr><td><code>digital</code></td><td><code>String</code></td><td>Non</td><td><p>Désigne la chaîne dans laquelle le contenu vidéo</p><p>est diffusé.</p></td></tr><tr><td><code>full_episode</code></td><td><code>Boolean</code></td><td>Non</td><td>Définir à <code>true</code> l'actif de contenu vidéo est un épisode complet.</td></tr><tr><td><code>livestream</code></td><td><code>Boolean</code></td><td>Non</td><td><p>Si le contenu vidéo est un livestream, ceci est défini sur</p><p><code>true</code>.</p></td></tr><tr><td><code>airdate</code></td><td><p><code>ISO 8601</code></p><p><code>Date String</code></p></td><td>Non</td><td><p>Désigne la date originale de diffusion / publication</p><p>du contenu vidéo.</p></td></tr><tr><td><code>cursor_position</code></td><td><code>Entier</code></td><td><strong>Oui</strong></td><td><p>Désigne la position actuelle du curseur dans le</p><p>contenu vidéo en secondes. Cela n'inclut pas</p><p>les annonces jouées pendant cette durée.</p><p>En cas de livestreams, référez-vous à la documentation de la destination concernée pour les détails sur la façon de transmettre cette propriété.</p></td></tr><tr><td><code>total_length</code></td><td><code>Entier</code></td><td><strong>Oui</strong></td><td><p>La durée totale du contenu vidéo en</p><p>secondes. Cela n'inclut aucune annonce incluse</p><p>dans la lecture de cet actif de contenu.</p><p>Pour la lecture en livestream, cela doit être défini sur <code>null</code>.</p></td></tr><tr><td><code>bitrate</code></td><td><code>Entier</code></td><td><strong>Oui</strong></td><td>Désigne le débit binaire actuel en <code>kbps</code>.</td></tr><tr><td><code>framerate</code></td><td><code>Float</code></td><td>Non</td><td>Désigne la fréquence d'images en <code>fps</code>.</td></tr><tr><td><code>sound</code></td><td><code>Entier</code></td><td><strong>Oui</strong></td><td><p>Dénote le niveau sonore actuel de la vidéo</p><p>Obligatoire dans <code>video_volume</code> événement</p></td></tr><tr><td><code>full_screen</code></td><td><code>Boolean</code></td><td><strong>Oui</strong></td><td>Dénote le mode d'écran actuel de la vidéo.<br>Obligatoire dans <code>video_fullscreen_on</code> et <code>video_full_screen_off</code> events</td></tr><tr><td><code>ad_enabled</code></td><td><code>Boolean</code></td><td>Non</td><td>Indique si les publicités étaient activées</td></tr><tr><td><code>image_quality</code></td><td><code>String</code></td><td><strong>Oui</strong></td><td>Dénote la résolution de qualité actuelle de la vidéo.<br>Obligatoire dans <code>video_quality</code> événement</td></tr></tbody></table>

## Reprise de la lecture

## Événements de paramètres

Cette section détaille tous les événements de paramètres vidéo.

Pour plus d'informations sur chacune des propriétés associées à ces événements, reportez-vous à la [**Propriétés des événements de paramètres**](#video-settings-properties) section.

### Volume vidéo

Cet événement est envoyé lorsque l'utilisateur modifie le volume audio du lecteur vidéo.

Un événement exemple est présenté ci-dessous :

{% tabs %}
{% tab title="JavaScript" %}

```javascript
{
    "event_name": "video_volume",
    "user": {},
    "video_session_id": "98765",
    "content_asset_id": ["0133370", "123456"],
    "content_pod_id": ["CAA", "CAB", "CAD"],
    "ad_asset_id": ["ad1", "ad0", "ad2"],
    "ad_pod_id": ["adCAA", "adCAB", "adCAD"],
    "ad_type": "mid-roll",
    "cursor_position": 420,
    "total_length": 600,
    "bitrate": 128,
    "framerate": 60.00,
    "video_player": "vimeo",
    "sound": 120,
    "full_screen": false,
    "ad_enabled": false,
    "image_quality": "hd720",
    "livestream": true
}
```

{% endtab %}

{% tab title="Kotlin (Android)" %}

```kotlin
val settingVideoEvent = TCVideoSettingEvent(ETCVideoSettingMode.video_volume, "YOUR_VIDEO_SESSION_ID")
settingVideoEvent.contentAssetID = "456"
settingVideoEvent.imageQuality = "720"
serverSide.execute(settingVideoEvent)
```

{% endtab %}

{% tab title="Java (Android)" %}

```java
TCVideoSettingEvent settingVideoEvent = new TCVideoSettingEvent(ETCVideoSettingMode.video_volume, "YOUR_VIDEO_SESSION_ID");
settingVideoEvent.contentAssetID = "456";
settingVideoEvent.imageQuality = "720";
serverSide.execute(settingVideoEvent);
```

{% endtab %}

{% tab title="Objective-C (iOS)" %}

```objectivec
    TCVideoSettingEvent *settingVideoEvent = [[TCVideoSettingEvent alloc] initWithMode: video_volume andSessionId: @"YOUR_VIDEO_SESSION_ID"];
    settingVideoEvent.contentAssetID = @"456";
    settingVideoEvent.imageQuality =  @"720";
    [serverside execute: settingVideoEvent];
```

{% endtab %}

{% tab title="Swift (iOS)" %}

```swift
let settingVideoEvent = TCVideoSettingEvent(mode: video_volume, andSessionId: "YOUR_VIDEO_SESSION_ID")
    settingVideoEvent?.contentAssetID = "456"
    settingVideoEvent?.imageQuality = "720"
    serverSide?.execute(settingVideoEvent)
```

{% endtab %}
{% endtabs %}

### Vitesse vidéo

Cet événement est envoyé lorsque l'utilisateur modifie la vitesse du lecteur vidéo.

Un événement exemple est présenté ci-dessous :

{% tabs %}
{% tab title="JavaScript" %}

```javascript
{
    "event_name": "video_speed",
    "user": {},
    "video_session_id": "98765",
    "content_asset_id": ["0133370", "123456"],
    "content_pod_id": ["CAA", "CAB", "CAD"],
    "ad_asset_id": ["ad1", "ad0", "ad2"],
    "ad_pod_id": ["adCAA", "adCAB", "adCAD"],
    "ad_type": "mid-roll",
    "cursor_position": 420,
    "total_length": 600,
    "bitrate": 128,
    "framerate": 60.00,
    "video_player": "vimeo",
    "sound": 120,
    "full_screen": false,
    "ad_enabled": false,
    "image_quality": "hd720",
    "livestream": true
}
```

{% endtab %}

{% tab title="Kotlin (Android)" %}

```kotlin
val settingVideoEvent = TCVideoSettingEvent(ETCVideoSettingMode.video_speed, "YOUR_VIDEO_SESSION_ID")
settingVideoEvent.contentAssetID = "456"
settingVideoEvent.imageQuality = "720"
serverSide.execute(settingVideoEvent)
```

{% endtab %}

{% tab title="Java (Android)" %}

```java
TCVideoSettingEvent settingVideoEvent = new TCVideoSettingEvent(ETCVideoSettingMode.video_speed, "YOUR_VIDEO_SESSION_ID");
settingVideoEvent.contentAssetID = "456";
settingVideoEvent.imageQuality = "720";
serverSide.execute(settingVideoEvent);
```

{% endtab %}

{% tab title="Objective-C (iOS)" %}

```objectivec
    TCVideoSettingEvent *settingVideoEvent = [[TCVideoSettingEvent alloc] initWithMode: video_speed andSessionId: @"YOUR_VIDEO_SESSION_ID"];
    settingVideoEvent.contentAssetID = @"456";
    settingVideoEvent.imageQuality =  @"720";
    [serverside execute: settingVideoEvent];
```

{% endtab %}

{% tab title="Swift (iOS)" %}

```swift
let settingVideoEvent = TCVideoSettingEvent(mode: video_speed, andSessionId: "YOUR_VIDEO_SESSION_ID")
    settingVideoEvent?.contentAssetID = "456"
    settingVideoEvent?.imageQuality = "720"
    serverSide?.execute(settingVideoEvent)
```

{% endtab %}
{% endtabs %}

### Sous-titres activés

Cet événement est envoyé lorsque l'utilisateur active les sous-titres du lecteur vidéo.

Un événement exemple est présenté ci-dessous :

{% tabs %}
{% tab title="JavaScript" %}

```javascript
{
    "event_name": "video_subtitle_on",
    "user": {},
    "video_session_id": "98765",
    "content_asset_id": ["0133370", "123456"],
    "content_pod_id": ["CAA", "CAB", "CAD"],
    "ad_asset_id": ["ad1", "ad0", "ad2"],
    "ad_pod_id": ["adCAA", "adCAB", "adCAD"],
    "ad_type": "pre-roll",
    "cursor_position": 420,
    "total_length": 600,
    "bitrate": 128,
    "framerate": 60.00,
    "video_player": "vimeo",
    "sound": 120,
    "full_screen": false,
    "ad_enabled": false,
    "image_quality": "hd720",
    "livestream": true
}
```

{% endtab %}

{% tab title="Kotlin (Android)" %}

```kotlin
val settingVideoEvent = TCVideoSettingEvent(ETCVideoSettingMode.video_subtitle_on, "YOUR_VIDEO_SESSION_ID")
settingVideoEvent.contentAssetID = "456"
settingVideoEvent.imageQuality = "720"
serverSide.execute(settingVideoEvent)
```

{% endtab %}

{% tab title="Java (Android)" %}

```java
TCVideoSettingEvent settingVideoEvent = new TCVideoSettingEvent(ETCVideoSettingMode.video_subtitle_on, "YOUR_VIDEO_SESSION_ID");
settingVideoEvent.contentAssetID = "456";
settingVideoEvent.imageQuality = "720";
serverSide.execute(settingVideoEvent);
```

{% endtab %}

{% tab title="Objective-C (iOS)" %}

```objectivec
    TCVideoSettingEvent *settingVideoEvent = [[TCVideoSettingEvent alloc] initWithMode: video_subtitle_on andSessionId: @"YOUR_VIDEO_SESSION_ID"];
    settingVideoEvent.contentAssetID = @"456";
    settingVideoEvent.imageQuality =  @"720";
    [serverside execute: settingVideoEvent];
```

{% endtab %}

{% tab title="Swift (iOS)" %}

```swift
let settingVideoEvent = TCVideoSettingEvent(mode: video_subtitle_on, andSessionId: "YOUR_VIDEO_SESSION_ID")
    settingVideoEvent?.contentAssetID = "456"
    settingVideoEvent?.imageQuality = "720"
    serverSide?.execute(settingVideoEvent)
```

{% endtab %}
{% endtabs %}

### Sous-titres désactivés

Cet événement est envoyé lorsque l'utilisateur désactive les sous-titres du lecteur vidéo.

Un événement exemple est présenté ci-dessous :

{% tabs %}
{% tab title="JavaScript" %}

```javascript
{
    "event_name": "video_subtitle_off",
    "user": {},
    "video_session_id": "98765",
    "content_asset_id": ["0133370", "123456"],
    "content_pod_id": ["CAA", "CAB", "CAD"],
    "ad_asset_id": ["ad1", "ad0", "ad2"],
    "ad_pod_id": ["adCAA", "adCAB", "adCAD"],
    "ad_type": "post-roll",
    "cursor_position": 420,
    "total_length": 600,
    "bitrate": 128,
    "framerate": 60.00,
    "video_player": "vimeo",
    "sound": 120,
    "full_screen": false,
    "ad_enabled": false,
    "image_quality": "hd720",
    "livestream": true
}
```

{% endtab %}

{% tab title="Kotlin (Android)" %}

```kotlin
val settingVideoEvent = TCVideoSettingEvent(ETCVideoSettingMode.video_subtitle_off, "YOUR_VIDEO_SESSION_ID")
settingVideoEvent.contentAssetID = "456"
settingVideoEvent.imageQuality = "720"
serverSide.execute(settingVideoEvent)
```

{% endtab %}

{% tab title="Java (Android)" %}

```
TCVideoSettingEvent settingVideoEvent = new TCVideoSettingEvent(ETCVideoSettingMode.video_subtitle_off, "YOUR_VIDEO_SESSION_ID");
settingVideoEvent.contentAssetID = "456";
settingVideoEvent.imageQuality = "720";
serverSide.execute(settingVideoEvent);
```

{% endtab %}

{% tab title="Objective-C (iOS)" %}

```objectivec
    TCVideoSettingEvent *settingVideoEvent = [[TCVideoSettingEvent alloc] initWithMode: video_subtitle_off andSessionId: @"YOUR_VIDEO_SESSION_ID"];
    settingVideoEvent.contentAssetID = @"456";
    settingVideoEvent.imageQuality =  @"720";
    [serverside execute: settingVideoEvent];
```

{% endtab %}

{% tab title="Swift (iOS)" %}

```swift
let settingVideoEvent = TCVideoSettingEvent(mode: video_subtitle_off, andSessionId: "YOUR_VIDEO_SESSION_ID")
    settingVideoEvent?.contentAssetID = "456"
    settingVideoEvent?.imageQuality = "720"
    serverSide?.execute(settingVideoEvent)
```

{% endtab %}
{% endtabs %}

### Plein écran activé

Cet événement est envoyé lorsque l'utilisateur active la vue plein écran du lecteur vidéo.

Un événement exemple est présenté ci-dessous :

{% tabs %}
{% tab title="JavaScript" %}

```javascript
{
    "event_name": "video_fullscreen_on",
    "user": {},
    "video_session_id": "98765",
    "content_asset_id": ["0133370", "123456"],
    "content_pod_id": ["CAA", "CAB", "CAD"],
    "ad_asset_id": ["ad1", "ad0", "ad2"],
    "ad_pod_id": ["adCAA", "adCAB", "adCAD"],
    "ad_type": "post-roll",
    "cursor_position": 420,
    "total_length": 600,
    "bitrate": 128,
    "framerate": 60.00,
    "video_player": "vimeo",
    "sound": 120,
    "full_screen": false,
    "ad_enabled": false,
    "image_quality": "hd720",
    "livestream": true
}
```

{% endtab %}

{% tab title="Kotlin (Android)" %}

```kotlin
val settingVideoEvent = TCVideoSettingEvent(ETCVideoSettingMode.video_fullscreen_on, "YOUR_VIDEO_SESSION_ID")
settingVideoEvent.contentAssetID = "456"
settingVideoEvent.imageQuality = "720"
serverSide.execute(settingVideoEvent)
```

{% endtab %}

{% tab title="Java (Android)" %}

```
TCVideoSettingEvent settingVideoEvent = new TCVideoSettingEvent(ETCVideoSettingMode.video_fullscreen_on, "YOUR_VIDEO_SESSION_ID");
settingVideoEvent.contentAssetID = "456";
settingVideoEvent.imageQuality = "720";
serverSide.execute(settingVideoEvent);
```

{% endtab %}

{% tab title="Objective-C (iOS)" %}

```objectivec
    TCVideoSettingEvent *settingVideoEvent = [[TCVideoSettingEvent alloc] initWithMode: video_fullscreen_on andSessionId: @"YOUR_VIDEO_SESSION_ID"];
    settingVideoEvent.contentAssetID = @"456";
    settingVideoEvent.imageQuality =  @"720";
    [serverside execute: settingVideoEvent];
```

{% endtab %}

{% tab title="Swift (iOS)" %}

```swift
let settingVideoEvent = TCVideoSettingEvent(mode: video_fullscreen_on, andSessionId: "YOUR_VIDEO_SESSION_ID")
    settingVideoEvent?.contentAssetID = "456"
    settingVideoEvent?.imageQuality = "720"
    serverSide?.execute(settingVideoEvent)
```

{% endtab %}
{% endtabs %}

### Plein écran désactivé

Cet événement est envoyé lorsque l'utilisateur désactive la vue plein écran du lecteur vidéo.

Un événement exemple est présenté ci-dessous :

{% tabs %}
{% tab title="JavaScript" %}

```javascript
{
    "event_name": "video_fullscreen_off",
    "user": {},
    "video_session_id": "98765",
    "content_asset_id": ["0133370", "123456"],
    "content_pod_id": ["CAA", "CAB", "CAD"],
    "ad_asset_id": ["ad1", "ad0", "ad2"],
    "ad_pod_id": ["adCAA", "adCAB", "adCAD"],
    "ad_type": "pre-roll",
    "cursor_position": 420,
    "total_length": 600,
    "bitrate": 128,
    "framerate": 60.00,
    "video_player": "vimeo",
    "sound": 120,
    "full_screen": false,
    "ad_enabled": false,
    "image_quality": "hd720",
    "livestream": true
}
```

{% endtab %}

{% tab title="Kotlin (Android)" %}

```kotlin
val settingVideoEvent = TCVideoSettingEvent(ETCVideoSettingMode.video_fullscreen_off, "YOUR_VIDEO_SESSION_ID")
settingVideoEvent.contentAssetID = "456"
settingVideoEvent.imageQuality = "720"
serverSide.execute(settingVideoEvent)
```

{% endtab %}

{% tab title="Java (Android)" %}

```java
TCVideoSettingEvent settingVideoEvent = new TCVideoSettingEvent(ETCVideoSettingMode.video_fullscreen_off, "YOUR_VIDEO_SESSION_ID");
settingVideoEvent.contentAssetID = "456";
settingVideoEvent.imageQuality = "720";
serverSide.execute(settingVideoEvent);
```

{% endtab %}

{% tab title="Objective-C (iOS)" %}

```
    TCVideoSettingEvent *settingVideoEvent = [[TCVideoSettingEvent alloc] initWithMode: video_fullscreen_off andSessionId: @"YOUR_VIDEO_SESSION_ID"];
    settingVideoEvent.contentAssetID = @"456";
    settingVideoEvent.imageQuality =  @"720";
    [serverside execute: settingVideoEvent];
```

{% endtab %}

{% tab title="Swift (iOS)" %}

```swift
let settingVideoEvent = TCVideoSettingEvent(mode: video_fullscreen_on, andSessionId: "YOUR_VIDEO_SESSION_ID")
    settingVideoEvent?.contentAssetID = "456"
    settingVideoEvent?.imageQuality = "720"
    serverSide?.execute(settingVideoEvent)
```

{% endtab %}
{% endtabs %}

### Qualité vidéo

Cet événement est envoyé lorsque la qualité vidéo du lecteur est modifiée.

Un événement exemple est présenté ci-dessous :

{% tabs %}
{% tab title="JavaScript" %}

```javascript
{
    "event_name": "video_quality",
    "user": {},
    "video_session_id": "98765",
    "content_asset_id": ["0133370", "123456"],
    "content_pod_id": ["CAA", "CAB", "CAD"],
    "ad_asset_id": ["ad1", "ad0", "ad2"],
    "ad_pod_id": ["adCAA", "adCAB", "adCAD"],
    "ad_type": "mid-roll", 
    "cursor_position": 420,
    "total_length": 600,
    "bitrate": 128,
    "framerate": 60.00,
    "video_player": "vimeo",
    "sound": 120,
    "full_screen": false,
    "ad_enabled": false,
    "image_quality": "hd720",
    "livestream": true
}
```

{% endtab %}

{% tab title="Kotlin (Android)" %}

```kotlin
val settingVideoEvent = TCVideoSettingEvent(ETCVideoSettingMode.video_quality, "YOUR_VIDEO_SESSION_ID")
settingVideoEvent.contentAssetID = "456"
settingVideoEvent.imageQuality = "720"
serverSide.execute(settingVideoEvent)
```

{% endtab %}

{% tab title="Java (Android)" %}

```java
TCVideoSettingEvent settingVideoEvent = new TCVideoSettingEvent(ETCVideoSettingMode.video_quality, "YOUR_VIDEO_SESSION_ID");
settingVideoEvent.contentAssetID = "456";
settingVideoEvent.imageQuality = "720";
serverSide.execute(settingVideoEvent);
```

{% endtab %}

{% tab title="Objective-C (iOS)" %}

```objectivec
    TCVideoSettingEvent *settingVideoEvent = [[TCVideoSettingEvent alloc] initWithMode: video_quality andSessionId: @"YOUR_VIDEO_SESSION_ID"];
    settingVideoEvent.contentAssetID = @"456";
    settingVideoEvent.imageQuality =  @"720";
    [serverside execute: settingVideoEvent];
```

{% endtab %}

{% tab title="Swift (iOS)" %}

```swift
let settingVideoEvent = TCVideoSettingEvent(mode: video_quality, andSessionId: "YOUR_VIDEO_SESSION_ID")
    settingVideoEvent?.contentAssetID = "456"
    settingVideoEvent?.imageQuality = "720"
    serverSide?.execute(settingVideoEvent)
```

{% endtab %}
{% endtabs %}

### Partage de vidéo

Cet événement est envoyé lorsque la vidéo est partagée par l'utilisateur.

Un événement exemple est présenté ci-dessous :

{% tabs %}
{% tab title="JavaScript" %}

```javascript
{
    "event_name": "video_share",
    "user": {},
    "video_session_id": "98765",
    "content_asset_id": ["0133370", "123456"],
    "content_pod_id": ["CAA", "CAB", "CAD"],
    "cursor_position": 420,
    "total_length": 600,
    "bitrate": 128,
    "framerate": 60.00,
    "video_player": "vimeo",
    "sound": 120,
    "full_screen": false,
    "ad_enabled": false,
    "image_quality": "hd720",
    "livestream": true
}
```

{% endtab %}

{% tab title="Kotlin (Android)" %}

```kotlin
val settingVideoEvent = TCVideoSettingEvent(ETCVideoSettingMode.video_share, "YOUR_VIDEO_SESSION_ID")
settingVideoEvent.contentAssetID = "456"
settingVideoEvent.imageQuality = "720"
serverSide.execute(settingVideoEvent)
```

{% endtab %}

{% tab title="Java (Android)" %}

```java
TCVideoSettingEvent settingVideoEvent = new TCVideoSettingEvent(ETCVideoSettingMode.video_share, "YOUR_VIDEO_SESSION_ID");
settingVideoEvent.contentAssetID = "456";
settingVideoEvent.imageQuality = "720";
serverSide.execute(settingVideoEvent);
```

{% endtab %}

{% tab title="Objective-C (iOS)" %}

```objectivec
    TCVideoSettingEvent *settingVideoEvent = [[TCVideoSettingEvent alloc] initWithMode: video_share andSessionId: @"YOUR_VIDEO_SESSION_ID"];
    settingVideoEvent.contentAssetID = @"456";
    settingVideoEvent.imageQuality =  @"720";
    [serverside execute: settingVideoEvent];
```

{% endtab %}

{% tab title="Swift (iOS)" %}

```swift
let settingVideoEvent = TCVideoSettingEvent(mode: video_share, andSessionId: "YOUR_VIDEO_SESSION_ID")
    settingVideoEvent?.contentAssetID = "456"
    settingVideoEvent?.imageQuality = "720"
    serverSide?.execute(settingVideoEvent)
```

{% endtab %}
{% endtabs %}

## Reprise de la lecture

Chaque `Video Playback Resumed` l'événement doit être suivi par un événement `Contenu vidéo en lecture` ou un `Annonce vidéo en lecture` event, en fonction de l'asset vers lequel la lecture reprend.

## Qualité vidéo

Commanders Act vous permet également de suivre et d'analyser la performance et la qualité de votre contenu vidéo pendant la lecture.

Chaque fois qu'un utilisateur change la qualité vidéo pendant la lecture, vous pouvez suivre un événement Video Quality Updated avec les propriétés suivantes :

* `bitrate`: Dénote le débit binaire mis à jour en `kbps`.
* `framerate`: Dénote la fréquence d'images mise à jour en `fps`.
* `startupTime`: Dénote le moment où la qualité vidéo a été modifiée par l'utilisateur.
* `droppedFrames`: Indique si des images ont été perdues lors du changement de qualité vidéo.

## Cycle de vie des événements

Le flux d'événements suivant montre comment vous pouvez implémenter la spécification vidéo de Commanders Act :

#### 1. L'utilisateur appuie sur play sur un lecteur vidéo

```javascript
cact("trigger","video_start", {
  video_session_id: "12345",
  content_asset_id: ["123"],
  content_pod_id: ["BAA"],
  ad_asset_id: ["ad1"],
  ad_pod_id: ["adCAA"],
  ad_type: "mid-roll",
  cursor_position: 0,
  total_length: 300,
  bitrate: 128,
  video_player: "youtube",
  sound: 67,
  full_screen: true,
  ad_enabled: false,
  image_quality: "hd1080",
});
```

#### 2. La lecture vidéo commence à jouer le contenu

```javascript
cact("trigger","video_content_start", {
  video_session_id: "12345",
  content_asset_id: "123",
  content_pod_id: "CAA",
  video_title: "Raw is War!!",
  video_description: "Sample description",
  keywords: ["wrestling", "entertainment"],
  season: "1",
  episode: "90",
  video_category: "entertainment",
  program: "WWE",
  publisher: "WWE",
  cursor_position: 0,
  total_length: 300,
  channel: "ten",
  full_episode: true,
  livestream: false,
  airdate: "2020-04-23",
});
```

#### 3. L'utilisateur regarde le contenu pendant 10 secondes suivi d'un heartbeat de 10 secondes

```javascript
cact("trigger","video_content_playing", {
  video_session_id: "12345",
  content_asset_id: "123",
  content_pod_id: "CAA",
  video_title: "Raw is War!!",
  video_description: "Sample description",
  keywords: ["wrestling", "entertainment"],
  season: "1",
  episode: "90",
  video_category: "entertainment",
  program: "WWE",
  publisher: "WWE",
  cursor_position: 10,
  total_length: 300,
  channel: "ten",
  full_episode: true,
  livestream: false,
  airdate: "2020-04-23",
})
```

#### 4. La lecture vidéo est mise en pause

```javascript
cact("trigger","video_pause", {
  video_session_id: "12345",
  content_asset_id: "123",
  content_pod_id: "CAA",
  ad_asset_id: null,
  ad_pod_id: null,
  ad_type: null,
  cursor_position: 11,
  total_length: 300,
  video_player: "youtube",
  sound: 66,
  bitrate: 128,
  full_screen: true,
  ad_enabled: false,
  image_quality: "hd1080",
});
```

#### 5. L'utilisateur reprend la lecture vidéo.

```javascript
cact("trigger","video_resume", {
  video_session_id: "12345",
  content_asset_id: "123",
  content_pod_id: "CAA",
  ad_asset_id: null,
  ad_pod_id: null,
  ad_type: null,
  cursor_position: 11,
  total_length: 300,
  video_player: "youtube",
  sound: 66,
  bitrate: 128,
  full_screen: true,
  ad_enabled: false,
  image_quality: "hd1080",
});
```

#### 6. Une pub (mid-roll) commence à être lue après que l'utilisateur a repris la lecture

```javascript
cact("trigger","video_ad_start", {
  video_session_id: "12345",
  ad_asset_id: "ad1",
  ad_pod_id: "adCAA",
  ad_type: "mid-roll",
  video_title: "Thums Up",
  publisher: "Coca Cola",
  cursor_position: 0,
  total_length: 15,
  load_type: "linear",
});
```

#### 7. L'utilisateur regarde complètement la publicité de 15 secondes. Commanders Act suit également les heartbeats de 10 secondes.

```javascript
cact("trigger","video_ad_playing", {
  video_session_id: "12345",
  ad_asset_id: "ad1",
  ad_pod_id: "adCAA",
  ad_type: "mid-roll",
  video_title: "Thums Up",
  publisher: "Coca Cola",
  cursor_position: 10,
  total_length: 15,
  load_type: "linear",
});
```

#### 8. La publicité vidéo est lue intégralement.

```javascript
cact("trigger","video_ad_complete", {
  video_session_id: "12345",
  ad_asset_id: "ad1",
  ad_pod_id: "adCAA",
  ad_type: "mid-roll",
  video_title: "Thums Up",
  publisher: "Coca Cola",
  cursor_position: 15,
  total_length: 15,
  load_type: "linear",
})
```

#### 9. La lecture du contenu vidéo reprend. Des heartbeats sont envoyés toutes les 10 secondes.

```javascript
cact("trigger","video_content_playing", {
  video_session_id: "12345",
  content_asset_id: "123",
  content_pod_id: "CAA",
  video_title: "Raw is War!!",
  video_description: "Sample description",
  keywords: ["wrestling", "entertainment"],
  season: "1",
  episode: "90",
  video_category: "entertainment",
  program: "WWE",
  publisher: "WWE",
  cursor_position: 11,
  total_length: 300,
  channel: "ten",
  full_episode: true,
  livestream: false,
  airdate: "2020-04-23",
})
```

#### 10. L'utilisateur termine le visionnage de l'intégralité du contenu vidéo.

```javascript
cact("trigger","video_content_complete", {
  video_session_id: "12345",
  content_asset_id: "123",
  content_pod_id: "CAA",
  video_title: "Raw is War!!",
  video_description: "Sample description",
  keywords: ["wrestling", "entertainment"],
  season: "1",
  episode: "90",
  video_category: "entertainment",
  program: "WWE",
  publisher: "WWE",
  cursor_position: 300,
  total_length: 300,
  channel: "ten",
  full_episode: true,
  livestream: false,
  airdate: "2020-04-23",
})
```

#### 11. La lecture vidéo se termine.

```javascript
cact("trigger","video_complete", {
  video_session_id: "12345",
  content_asset_id: null,
  content_pod_id: null,
  ad_asset_id: "ad1",
  ad_pod_id: "adCAA",
  ad_type: null,
  cursor_position: 300,
  total_length: 300,
  sound: 66,
  bitrate: 128,
  full_screen: true,
  video_player: "youtube",
  ad_enabled: false,
  image_quality: "hd1080",
})
```

## FAQ

#### Qu'est-ce que les publicités pre-roll, mid-roll et post-roll ?

* Les publicités qui apparaissent avant le début de la lecture vidéo sont appelées pre-roll ads.
* Les publicités qui apparaissent au milieu de la lecture sont des mid-roll ads.
* Les publicités qui apparaissent après la lecture vidéo sont appelées post-roll ads.

Ces publicités peuvent être une vidéo promotionnelle par les sponsors ou un contenu proposé par le fournisseur de contenu.
