# Required tracks (/docs/rules/required-tracks)

Reports a track layout that does not match the configured requirements.



{/* Generated by scripts/generate-docs.ts. Do not edit. */}

| Property         | Value                                                                                 |
| :--------------- | :------------------------------------------------------------------------------------ |
| Id               | `required-tracks`                                                                     |
| Category         | Project                                                                               |
| Default severity | warning                                                                               |
| Scope            | [`required-tracks`](/docs/reference/computed-scopes#required-tracks) (computed scope) |

## Options [#options]

| Option            | Type       | Default | Description                                                        |
| :---------------- | :--------- | :------ | :----------------------------------------------------------------- |
| `minVideoTracks`  | `number`   | `0`     | Minimum number of video tracks. 0: not checked.                    |
| `minAudioTracks`  | `number`   | `0`     | Minimum number of audio tracks. 0: not checked.                    |
| `videoTrackNames` | `string[]` | `[]`    | Names that must exist among video tracks.                          |
| `audioTrackNames` | `string[]` | `[]`    | Names that must exist among audio tracks.                          |
| `tracks`          | `json`     | `[]`    | Per-position requirements: \{ "ref": "V1", "name"?, "nonEmpty"? }. |

## Customize it [#customize-it]

Turn the rule on or off in the panel's Rules settings. To change its options, severity or wording, open it with its cogwheel in the rule editor and save: your copy replaces the built-in rule until you revert it. You can also copy the file below into your rules folder as `required-tracks.rule.json` and edit it. See [Change a built-in rule](/docs/editor/saving#change-a-built-in-rule).

## Rule file [#rule-file]

```json title="required-tracks.rule.json"
{
  "formatVersion": 1,
  "id": "required-tracks",
  "name": {
    "en_US": "Required tracks",
    "de_DE": "Erforderliche Spuren",
    "es_ES": "Pistas obligatorias",
    "fr_FR": "Pistes requises",
    "it_IT": "Tracce obbligatorie",
    "ja_JP": "必須のトラック",
    "ko_KR": "필수 트랙",
    "pt_BR": "Trilhas obrigatórias",
    "ru_RU": "Обязательные дорожки",
    "zh_CN": "必需轨道"
  },
  "description": {
    "en_US": "Reports a track layout that does not match the configured requirements.",
    "de_DE": "Meldet ein Spurlayout, das nicht den konfigurierten Anforderungen entspricht.",
    "es_ES": "Detecta una disposición de pistas que no cumple los requisitos configurados.",
    "fr_FR": "Signale une disposition des pistes qui ne correspond pas aux exigences configurées.",
    "it_IT": "Segnala una disposizione delle tracce che non corrisponde ai requisiti configurati.",
    "ja_JP": "設定された要件と一致しないトラック構成を報告します。",
    "ko_KR": "설정된 요구 사항과 맞지 않는 트랙 구성을 보고합니다.",
    "pt_BR": "Relata uma disposição de trilhas que não corresponde aos requisitos configurados.",
    "ru_RU": "Сообщает о структуре дорожек, не соответствующей заданным требованиям.",
    "zh_CN": "报告与已配置要求不符的轨道布局。"
  },
  "category": "project",
  "scope": "required-tracks",
  "severity": "warning",
  "options": {
    "minVideoTracks": {
      "type": "number",
      "default": 0,
      "description": "Minimum number of video tracks. 0: not checked."
    },
    "minAudioTracks": {
      "type": "number",
      "default": 0,
      "description": "Minimum number of audio tracks. 0: not checked."
    },
    "videoTrackNames": {
      "type": "string[]",
      "default": [],
      "description": "Names that must exist among video tracks."
    },
    "audioTrackNames": {
      "type": "string[]",
      "default": [],
      "description": "Names that must exist among audio tracks."
    },
    "tracks": {
      "type": "json",
      "default": [],
      "description": "Per-position requirements: { \"ref\": \"V1\", \"name\"?, \"nonEmpty\"? }."
    }
  },
  "checks": [
    {
      "condition": {
        "field": "violation.kind",
        "operator": "equals",
        "value": "minVideo"
      },
      "message": {
        "en_US": {
          "count": "violation.count",
          "one": "Sequence has {violation.count} video track (at least {violation.min} required).",
          "other": "Sequence has {violation.count} video tracks (at least {violation.min} required)."
        },
        "de_DE": {
          "count": "violation.count",
          "one": "Die Sequenz hat {violation.count} Videospur (mindestens {violation.min} erforderlich).",
          "other": "Die Sequenz hat {violation.count} Videospuren (mindestens {violation.min} erforderlich)."
        },
        "es_ES": {
          "count": "violation.count",
          "one": "La secuencia tiene {violation.count} pista de vídeo (mínimo obligatorio: {violation.min}).",
          "other": "La secuencia tiene {violation.count} pistas de vídeo (mínimo obligatorio: {violation.min})."
        },
        "fr_FR": {
          "count": "violation.count",
          "one": "La séquence comporte {violation.count} piste vidéo (minimum requis : {violation.min}).",
          "other": "La séquence comporte {violation.count} pistes vidéo (minimum requis : {violation.min})."
        },
        "it_IT": {
          "count": "violation.count",
          "one": "La sequenza ha {violation.count} traccia video (almeno {violation.min} richieste).",
          "other": "La sequenza ha {violation.count} tracce video (almeno {violation.min} richieste)."
        },
        "ja_JP": "シーケンスのビデオトラックは{violation.count}個です（{violation.min}個以上必要）。",
        "ko_KR": "시퀀스의 비디오 트랙이 {violation.count}개입니다(최소 {violation.min}개 필요).",
        "pt_BR": {
          "count": "violation.count",
          "one": "A sequência tem {violation.count} trilha de vídeo (mínimo exigido: {violation.min}).",
          "other": "A sequência tem {violation.count} trilhas de vídeo (mínimo exigido: {violation.min})."
        },
        "ru_RU": {
          "count": "violation.count",
          "one": "В эпизоде {violation.count} видеодорожка (требуется не менее {violation.min}).",
          "few": "В эпизоде {violation.count} видеодорожки (требуется не менее {violation.min}).",
          "many": "В эпизоде {violation.count} видеодорожек (требуется не менее {violation.min}).",
          "other": "В эпизоде {violation.count} видеодорожки (требуется не менее {violation.min})."
        },
        "zh_CN": "序列有 {violation.count} 个视频轨道（至少需要 {violation.min} 个）。"
      }
    },
    {
      "condition": {
        "field": "violation.kind",
        "operator": "equals",
        "value": "minAudio"
      },
      "message": {
        "en_US": {
          "count": "violation.count",
          "one": "Sequence has {violation.count} audio track (at least {violation.min} required).",
          "other": "Sequence has {violation.count} audio tracks (at least {violation.min} required)."
        },
        "de_DE": {
          "count": "violation.count",
          "one": "Die Sequenz hat {violation.count} Audiospur (mindestens {violation.min} erforderlich).",
          "other": "Die Sequenz hat {violation.count} Audiospuren (mindestens {violation.min} erforderlich)."
        },
        "es_ES": {
          "count": "violation.count",
          "one": "La secuencia tiene {violation.count} pista de audio (mínimo obligatorio: {violation.min}).",
          "other": "La secuencia tiene {violation.count} pistas de audio (mínimo obligatorio: {violation.min})."
        },
        "fr_FR": {
          "count": "violation.count",
          "one": "La séquence comporte {violation.count} piste audio (minimum requis : {violation.min}).",
          "other": "La séquence comporte {violation.count} pistes audio (minimum requis : {violation.min})."
        },
        "it_IT": {
          "count": "violation.count",
          "one": "La sequenza ha {violation.count} traccia audio (almeno {violation.min} richieste).",
          "other": "La sequenza ha {violation.count} tracce audio (almeno {violation.min} richieste)."
        },
        "ja_JP": "シーケンスのオーディオトラックは{violation.count}個です（{violation.min}個以上必要）。",
        "ko_KR": "시퀀스의 오디오 트랙이 {violation.count}개입니다(최소 {violation.min}개 필요).",
        "pt_BR": {
          "count": "violation.count",
          "one": "A sequência tem {violation.count} trilha de áudio (mínimo exigido: {violation.min}).",
          "other": "A sequência tem {violation.count} trilhas de áudio (mínimo exigido: {violation.min})."
        },
        "ru_RU": {
          "count": "violation.count",
          "one": "В эпизоде {violation.count} аудиодорожка (требуется не менее {violation.min}).",
          "few": "В эпизоде {violation.count} аудиодорожки (требуется не менее {violation.min}).",
          "many": "В эпизоде {violation.count} аудиодорожек (требуется не менее {violation.min}).",
          "other": "В эпизоде {violation.count} аудиодорожки (требуется не менее {violation.min})."
        },
        "zh_CN": "序列有 {violation.count} 个音频轨道（至少需要 {violation.min} 个）。"
      }
    },
    {
      "condition": {
        "field": "violation.kind",
        "operator": "equals",
        "value": "missingVideoName"
      },
      "message": {
        "en_US": "No video track named \"{violation.name}\".",
        "de_DE": "Keine Videospur namens „{violation.name}“.",
        "es_ES": "No hay ninguna pista de vídeo con el nombre \"{violation.name}\".",
        "fr_FR": "Aucune piste vidéo nommée « {violation.name} ».",
        "it_IT": "Nessuna traccia video denominata \"{violation.name}\".",
        "ja_JP": "「{violation.name}」という名前のビデオトラックがありません。",
        "ko_KR": "이름이 \"{violation.name}\"인 비디오 트랙이 없습니다.",
        "pt_BR": "Nenhuma trilha de vídeo com o nome \"{violation.name}\".",
        "ru_RU": "Нет видеодорожки с именем «{violation.name}».",
        "zh_CN": "没有名为“{violation.name}”的视频轨道。"
      }
    },
    {
      "condition": {
        "field": "violation.kind",
        "operator": "equals",
        "value": "missingAudioName"
      },
      "message": {
        "en_US": "No audio track named \"{violation.name}\".",
        "de_DE": "Keine Audiospur namens „{violation.name}“.",
        "es_ES": "No hay ninguna pista de audio con el nombre \"{violation.name}\".",
        "fr_FR": "Aucune piste audio nommée « {violation.name} ».",
        "it_IT": "Nessuna traccia audio denominata \"{violation.name}\".",
        "ja_JP": "「{violation.name}」という名前のオーディオトラックがありません。",
        "ko_KR": "이름이 \"{violation.name}\"인 오디오 트랙이 없습니다.",
        "pt_BR": "Nenhuma trilha de áudio com o nome \"{violation.name}\".",
        "ru_RU": "Нет аудиодорожки с именем «{violation.name}».",
        "zh_CN": "没有名为“{violation.name}”的音频轨道。"
      }
    },
    {
      "condition": {
        "field": "violation.kind",
        "operator": "equals",
        "value": "missingTrack"
      },
      "message": {
        "en_US": "Track {violation.trackRef} is required and does not exist.",
        "de_DE": "Spur {violation.trackRef} ist erforderlich, existiert aber nicht.",
        "es_ES": "La pista {violation.trackRef} es obligatoria y no existe.",
        "fr_FR": "La piste {violation.trackRef} est requise mais n'existe pas.",
        "it_IT": "La traccia {violation.trackRef} è obbligatoria e non esiste.",
        "ja_JP": "トラック {violation.trackRef} は必須ですが、存在しません。",
        "ko_KR": "트랙 {violation.trackRef}이(가) 필요하지만 존재하지 않습니다.",
        "pt_BR": "A trilha {violation.trackRef} é obrigatória e não existe.",
        "ru_RU": "Дорожка {violation.trackRef} обязательна, но отсутствует.",
        "zh_CN": "轨道 {violation.trackRef} 为必需轨道，但不存在。"
      }
    },
    {
      "condition": {
        "field": "violation.kind",
        "operator": "equals",
        "value": "wrongName"
      },
      "message": {
        "en_US": "Track {violation.trackRef} is named \"{violation.name}\", expected \"{violation.expected}\".",
        "de_DE": "Spur {violation.trackRef} heißt „{violation.name}“, erwartet: „{violation.expected}“.",
        "es_ES": "La pista {violation.trackRef} se llama \"{violation.name}\"; se esperaba \"{violation.expected}\".",
        "fr_FR": "La piste {violation.trackRef} est nommée « {violation.name} » au lieu de « {violation.expected} ».",
        "it_IT": "La traccia {violation.trackRef} è denominata \"{violation.name}\", previsto \"{violation.expected}\".",
        "ja_JP": "トラック {violation.trackRef} の名前は「{violation.name}」ですが、「{violation.expected}」である必要があります。",
        "ko_KR": "트랙 {violation.trackRef}의 이름이 \"{violation.name}\"입니다. 필요한 이름: \"{violation.expected}\".",
        "pt_BR": "A trilha {violation.trackRef} tem o nome \"{violation.name}\", esperado \"{violation.expected}\".",
        "ru_RU": "Дорожка {violation.trackRef} называется «{violation.name}», ожидалось «{violation.expected}».",
        "zh_CN": "轨道 {violation.trackRef} 名为“{violation.name}”，应为“{violation.expected}”。"
      }
    },
    {
      "condition": {
        "field": "violation.kind",
        "operator": "equals",
        "value": "empty"
      },
      "message": {
        "en_US": "Track {violation.trackRef} (\"{violation.trackName}\") is required to carry clips and is empty.",
        "de_DE": "Spur {violation.trackRef} („{violation.trackName}“) muss Clips enthalten, ist aber leer.",
        "es_ES": "Pista {violation.trackRef} (\"{violation.trackName}\") debe contener clips y está vacía.",
        "fr_FR": "Piste {violation.trackRef} (« {violation.trackName} ») doit contenir des éléments mais est vide.",
        "it_IT": "Traccia {violation.trackRef} (\"{violation.trackName}\") deve contenere clip ed è vuota.",
        "ja_JP": "トラック {violation.trackRef}（「{violation.trackName}」）にはクリップが必要ですが、空です。",
        "ko_KR": "트랙 {violation.trackRef}(\"{violation.trackName}\")에는 클립이 있어야 하지만 비어 있습니다.",
        "pt_BR": "Trilha {violation.trackRef} (\"{violation.trackName}\") deve conter clipes e está vazia.",
        "ru_RU": "Дорожка {violation.trackRef} («{violation.trackName}») должна содержать клипы, но пуста.",
        "zh_CN": "轨道 {violation.trackRef}（“{violation.trackName}”） 必须包含剪辑，但为空。"
      }
    }
  ],
  "data": {
    "requirement": "violation.requirement",
    "found": "violation.found"
  }
}
```
