> ## Documentation Index
> Fetch the complete documentation index at: https://docs.youka.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Projets

> Téléversez des médias et créez, inspectez, listez et supprimez des projets de karaoké

Les projets sont la ressource de plus haut niveau dans Youka. Chaque projet possède son fichier source, des stems séparés, des paroles synchronisées, des exports et les paramètres du projet.

## Créer un projet

Dans la plupart des cas, utilisez `client.projects.create()` — il gère les téléversements pour vous.

```ts theme={null}
const operation = await client.projects.create({
  source: { type: "path", path: "./song.mp3" },
  lyricsSource: { type: "transcribe" },
});
// => ProjectOperation
```

### Types de sources

<Tabs>
  <Tab title="path">
    Lit un fichier depuis le disque.

    ```ts theme={null}
    source: {
      type: "path",
      path: "./song.mp3",
      contentType: "audio/mpeg", // optional, inferred if omitted
    }
    ```
  </Tab>

  <Tab title="bytes">
    `Blob`, `File`, `ArrayBuffer` ou `Uint8Array` en mémoire.

    ```ts theme={null}
    source: {
      type: "bytes",
      data: fileBuffer,
      filename: "song.mp3",
      contentType: "audio/mpeg", // optional
    }
    ```
  </Tab>

  <Tab title="url">
    URL HTTP ou HTTPS distante.

    Les pages hébergées prises en charge dépendent de yt-dlp. Voir la [liste des URL prises en charge](https://github.com/yt-dlp/yt-dlp/blob/master/supportedsites.md).

    ```ts theme={null}
    source: {
      type: "url",
      url: "https://example.com/song.mp4",
      maxVideoQuality: "1080p", // optional: "720p", "1080p", "4k", or "best"
    }
    ```

    `maxVideoQuality` contrôle la qualité vidéo maximale téléchargée pour les
    sources URL. Elle est par défaut à `1080p`. Le SDK utilise la meilleure
    qualité disponible jusqu’à cette limite, et se rabat sur le meilleur format
    disponible si la plateforme n’expose pas de flux plafonné. Utilisez `best`
    pour ne pas plafonner.

    <Note>
      Sur Node.js et Bun, le SDK s’assure automatiquement de la présence des
      binaires de dépendances URL requis (`ffmpeg`, `ffprobe`, `yt-dlp`) lors de
      la première utilisation. L’équivalent CLI est `youka deps ensure --for url`.
    </Note>
  </Tab>
</Tabs>

### Autres champs

<ParamField path="title" type="string">
  Titre du projet. Par défaut, le nom de fichier de la source.
</ParamField>

<ParamField path="splitModel" type="SplitModel">
  Modèle de séparation des stems. Par défaut `mdx23c`. Voir la [référence des modèles
  Split](/fr/desktop/split-model).
</ParamField>

<ParamField path="presetId" type="string">
  Appliquer un preset réutilisable au moment de la création.
</ParamField>

<ParamField path="lyricsSource" type="LyricsSource">
  Configurer la synchronisation des paroles. Voir ci-dessous.
</ParamField>

### Sources de paroles

```ts theme={null}
// Transcribe lyrics from the audio
lyricsSource: {
  type: "transcribe",
  syncModel: "audioshake-transcription", // optional
  language: "en",                        // optional
}

// Align exact lyrics to the audio
lyricsSource: {
  type: "align",
  lyrics: "First line\nSecond line\n...",
  syncModel: "audioshake-alignment",
}

```

## `client.projects.create(input, options?)`

`client.projects.create()` accepte aussi une source `inputFile` de bas niveau lorsque vous disposez déjà d’un `inputFileId` téléversé.

```ts theme={null}
const upload = await client.uploads.create({
  filename: "song.mp3",
  contentType: "audio/mpeg",
  contentLength: buffer.byteLength,
});

await client.uploads.upload(upload.uploadUrl, buffer, {
  contentType: "audio/mpeg",
});

const operation = await client.projects.create({
  source: {
    type: "inputFile",
    inputFileId: upload.inputFileId,
    filename: "song.mp3",
  },
  title: "My Song",
});
```

## `client.projects.quote(input, options?)`

Estimer les crédits requis pour créer un projet sans le créer.

```ts theme={null}
const quote = await client.projects.quote({
  source: { type: "path", path: "./song.mp3" },
  lyricsSource: { type: "transcribe", language: "en" },
  splitModel: "mdx23c",
});

console.log(quote.creditsRequired, quote.sufficientBalance);
```

`client.projects.quote(...)` accepte les mêmes formes de `source` que
`client.projects.create(...)`, y compris `maxVideoQuality` pour les URL. Si vous
connaissez déjà la durée du média et ne voulez pas téléverser le fichier
uniquement pour obtenir un devis, passez la forme REST de bas niveau :

```ts theme={null}
const quote = await client.projects.quote({
  durationSeconds: 210,
  lyricsSource: null,
  splitModel: "mdx23c",
});
```

## `client.uploads.create(body, options?)`

Allouer un emplacement de téléversement et obtenir une URL signée.

```ts theme={null}
const upload = await client.uploads.create({
  filename: "song.mp3",
  contentType: "audio/mpeg",
  contentLength: 4_521_344,
});
// => { inputFileId, uploadUrl }
```

## `client.uploads.upload(uploadUrl, body, options?)`

Effectuer un PUT des octets du fichier vers l’URL signée.

```ts theme={null}
await client.uploads.upload(upload.uploadUrl, fileBuffer, {
  contentType: "audio/mpeg",
  signal: abortController.signal,
});
```

<ParamField path="body" type="FetchBody" required>
  Tout corps compatible `fetch` : `Blob`, `File`, `ArrayBuffer`, `Uint8Array`,
  `ReadableStream` ou `string`.
</ParamField>

Lève `YoukaRequestError` avec le code `UPLOAD_FAILED` si le téléversement renvoie un statut non-2xx.

## `client.projects.get(projectId, options?)`

Récupérer l’état complet du projet, y compris les stems, les paroles et les exports.

```ts theme={null}
const project = await client.projects.get("prj_abc123");
console.log(project.title, project.stems, project.lyrics);
```

## `client.projects.update(projectId, body, options?)`

Mettre à jour les métadonnées du projet (patch).

```ts theme={null}
const project = await client.projects.update("prj_abc123", {
  title: "Updated title",
  artists: ["Artist name"],
});
```

Passez au moins l’un de `title` ou `artists`.

## `client.projects.list(options?)`

Lister tous les projets appartenant au compte authentifié.

```ts theme={null}
const projects = await client.projects.list();
projects.forEach((p) => console.log(p.id, p.title));
```

Renvoie un tableau d’éléments de liste de projets (une forme plus légère que `getProject`).

## `client.projects.delete(projectId, options?)`

Supprimer un projet et tous ses stems, paroles et exports associés.

```ts theme={null}
await client.projects.delete("prj_abc123", {
  idempotencyKey: "delete-prj_abc123",
});
```

<Warning>
  La suppression est définitive. Associez-la à une clé d’idempotence afin que les nouvelles tentatives soient sûres.
</Warning>

## Et ensuite

* [Stems](/fr/sdk/stems) — relancer la séparation des stems
* [Lyrics sync](/fr/sdk/lyrics-sync) — re-synchroniser les paroles
* [Exports](/fr/sdk/exports) — rendre les vidéos finalisées
* [Tasks](/fr/sdk/tasks) — attendre les opérations de projet avec `client.projects.wait`
