> ## 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.

# Projekte

> Medien hochladen und Karaoke-Projekte erstellen, prüfen, auflisten und löschen

Projekte sind die übergeordnete Ressource in Youka. Jedes Projekt besitzt seine Quelldatei, getrennte Stems, synchronisierte Lyrics, Exporte und Projekteinstellungen.

## Ein Projekt erstellen

Für die meisten Anwendungsfälle verwende `client.projects.create()` — das übernimmt Uploads für dich.

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

### Source-Typen

<Tabs>
  <Tab title="path">
    Liest eine Datei von der Festplatte.

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

  <Tab title="bytes">
    In-Memory-`Blob`, `File`, `ArrayBuffer` oder `Uint8Array`.

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

  <Tab title="url">
    Remote-HTTP- oder HTTPS-URL.

    Welche gehosteten Seiten unterstützt werden, hängt von yt-dlp ab. Siehe die [Liste unterstützter URLs](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` steuert die maximal heruntergeladene Videoqualität für URL-Quellen. Standardmäßig ist es `1080p`. Das SDK verwendet die beste verfügbare Qualität bis zu diesem Limit und fällt auf das beste verfügbare Format zurück, wenn die Plattform keinen begrenzten Stream anbietet. Verwende `best` für keine Begrenzung.

    <Note>
      Unter Node.js und Bun stellt das SDK bei der ersten Verwendung automatisch die erforderlichen URL-Abhängigkeits-Binaries (`ffmpeg`, `ffprobe`, `yt-dlp`) sicher. Das CLI-Äquivalent ist `youka deps ensure --for url`.
    </Note>
  </Tab>
</Tabs>

### Weitere Felder

<ParamField path="title" type="string">
  Projekttitel. Standardmäßig der Dateiname der Quelle.
</ParamField>

<ParamField path="splitModel" type="SplitModel">
  Modell zur Stem-Separation. Standardmäßig `mdx23c`. Siehe [Split-Model-Referenz](/de/desktop/split-model).
</ParamField>

<ParamField path="presetId" type="string">
  Wende beim Erstellen ein wiederverwendbares Preset an.
</ParamField>

<ParamField path="lyricsSource" type="LyricsSource">
  Konfiguriere die Lyrics-Synchronisation. Siehe unten.
</ParamField>

### Lyrics-Quellen

```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()` akzeptiert auch eine Low-Level-`inputFile`-Quelle, wenn du bereits eine hochgeladene `inputFileId` hast.

```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?)`

Schätze die Credits, die zum Erstellen eines Projekts benötigt werden, ohne es zu erstellen.

```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(...)` akzeptiert dieselben `source`-Formen wie `client.projects.create(...)`, einschließlich URL-`maxVideoQuality`. Wenn du die Mediendauer bereits kennst und die Datei nicht nur für ein Quote hochladen möchtest, übergib die Low-Level-REST-Form:

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

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

Reserviere einen Upload-Slot und erhalte eine signierte URL.

```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?)`

Führe ein PUT der Datei-Bytes auf die signierte URL aus.

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

<ParamField path="body" type="FetchBody" required>
  Beliebiger `fetch`-kompatibler Body: `Blob`, `File`, `ArrayBuffer`, `Uint8Array`,
  `ReadableStream` oder `string`.
</ParamField>

Wirft `YoukaRequestError` mit Code `UPLOAD_FAILED`, wenn der Upload einen Nicht-2xx-Status zurückgibt.

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

Rufe den vollständigen Projektstatus ab, einschließlich Stems, Lyrics und Exporten.

```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?)`

Patche Projekt-Metadaten.

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

Übergebe mindestens eines von `title` oder `artists`.

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

Liste jedes Projekt auf, das dem authentifizierten Account gehört.

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

Gibt ein Array von Projekt-Listeneinträgen zurück (eine schlankere Form als `getProject`).

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

Lösche ein Projekt und alle zugehörigen Stems, Lyrics und Exporte.

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

<Warning>
  Das Löschen ist dauerhaft. Kombiniere es mit einem Idempotency-Key, damit Retries sicher sind.
</Warning>

## Was als Nächstes

* [Stems](/de/sdk/stems) — Stem-Separation erneut ausführen
* [Lyrics sync](/de/sdk/lyrics-sync) — Lyrics erneut synchronisieren
* [Exports](/de/sdk/exports) — fertige Videos rendern
* [Tasks](/de/sdk/tasks) — auf Projekt-Operationen warten mit `client.projects.wait`
