Discord Video Converter

Discord Video Converter – darmowe narzędzie webowe do kompresji filmów pod limity rozmiaru pliku na Discordzie. Narzędzie obsługuje konta bez Nitro (9 MB) oraz z Nitro Basic (50 MB), a także dwa presety kodowania. Projekt napisał Shieldziak.

Narzędzie kompresuje wideo pod limity Discorda — wybierasz tier konta i preset, a następnie serwer automatycznie dobiera bitrate i rozdzielczość tak, by plik zmieścił się w limicie. Interfejs nawiązuje stylistycznie do Discorda, natomiast obsługa sprowadza się do: wybór pliku → tier → preset → przycisk „Wyślij i konwertuj” → pasek postępu → pobranie gotowego .mp4. Logowanie przez Discord działa wyłącznie jako zabezpieczenie przed spamem — zakres identify oznacza, że aplikacja nie widzi wiadomości ani serwerów użytkownika.

Informacje ogólne

  • Adres: https://conv.dsh.yt/
  • Autoryzacja: wymagane logowanie przez Discord (OAuth2)
  • Rate limit: 1 konwersja na 60 sekund per konto Discord
  • Limit uploadu: max 250 MB (rozmiar wejściowy)
  • Czas przechowywania plików: 10 minut od zakończenia konwersji
  • Równoległe konwersje: max 2 jednocześnie (kolejka globalna)

Obsługiwane formaty wejściowe

FormatRozszerzenie
MP4.mp4
MOV.mov
WebM.webm

Wyjście zawsze w formacie .mp4.

Tryby Nitro

TrybDocelowy rozmiar wyjściowy
Brak Nitromax 9 MB
Nitro Basicmax 50 MB

Presety kodowania

PresetKoder wideoAudioCharakterystyka
h264libx264 / h264_nvencAACCBR, szybsza konwersja, mniejszy rozmiar
vp9libvpx-vp9OpusLepsza jakość przy tym samym rozmiarze

Jeśli serwer posiada kartę NVIDIA z obsługą NVENC, konwersja H.264 odbywa się sprzętowo.

Endpointy

MetodaEndpointOpisWymaga logowania
GET/Strona główna z interfejsem użytkownikaNie
GET/loginPrzekierowanie do Discord OAuth2Nie
GET/callbackObsługa powrotu z Discord OAuth2Nie
GET/logoutWylogowanie (czyszczenie sesji)Nie
POST/uploadUpload całego pliku jednorazowoTak
POST/upload_chunkUpload pojedynczego fragmentu (chunked upload)Tak
POST/merge_chunks/<task_id>Złączenie fragmentów i dodanie zadania do kolejkiTak
POST/upload_urlPobranie wideo z podanego URL i konwersjaTak
GET/status/<task_id>Sprawdzenie postępu konwersji (JSON)Nie
GET/download/<task_id>Pobranie gotowego pliku .mp4Nie

/upload — upload pliku

Przyjmuje multipart/form-data z następującymi polami:

PoleTypOpis
fileplikPlik wideo (.mp4, .mov, .webm)
task_idstringUnikalny identyfikator zadania
tierstringbasic (9 MB) lub nitro (50 MB)
presetstringh264 (szybkość) lub vp9 (jakość)

Zwraca: task_id jako plaintext lub błąd z kodem HTTP.

/upload_chunk — upload fragmentowany

Dla dużych plików frontend może wysyłać plik w kawałkach. Każde żądanie zawiera:

PoleTypOpis
fileplikFragment pliku
task_idstringIdentyfikator zadania
chunk_indexintNumer fragmentu (od 0)

Po wysłaniu wszystkich fragmentów należy wywołać /merge_chunks/<task_id>.

/upload_url — konwersja z URL

Przyjmuje multipart/form-data:

PoleTypOpis
urlstringBezpośredni link do pliku wideo
task_idstringIdentyfikator zadania
tierstringbasic lub nitro
presetstringh264 lub vp9

Serwer weryfikuje URL przez zapytanie HEAD (sprawdza content-type i content-length) przed pobraniem.

/status/<task_id> — status zadania

Zwraca JSON:

{
  "progress": 74,
  "done": false,
  "path_ready": false,
  "note": "Trwa konwersja..."
}
PoleTypOpis
progressintPostęp w procentach (0–100)
doneboolCzy zadanie zostało zakończone
path_readyboolCzy plik jest gotowy do pobrania
notestringKomunikat o aktualnym etapie lub błędzie

/download/<task_id> — pobranie pliku

Zwraca plik .mp4 jako załącznik (Content-Disposition: attachment).
Jeśli path_ready jest false lub plik wygasł, zwraca 404.

Kody błędów

Kod HTTPZnaczenie
400Brak pliku, niedozwolony format, nieprawidłowy task_id
401Brak zalogowania przez Discord
404Plik nie istnieje lub wygasł
413Plik przekracza limit uploadu (250 MB)
429Przekroczono rate limit (60s) lub kolejka konwersji jest pełna
500Błąd serwera / nieudana konwersja

Przykład użycia (JavaScript)

// 1. Upload pliku
const formData = new FormData();
formData.append("file", fileInput.files[0]);
formData.append("task_id", crypto.randomUUID());
formData.append("tier", "basic");
formData.append("preset", "h264");

const uploadRes = await fetch("https://conv.dsh.yt/upload", {
  method: "POST",
  body: formData,
  credentials: "include"
});
const taskId = await uploadRes.text();

// 2. Polling statusu
let done = false;
while (!done) {
  await new Promise(r => setTimeout(r, 1500));
  const status = await fetch(`https://conv.dsh.yt/status/${taskId}`).then(r => r.json());
  console.log(`Postęp: ${status.progress}%`);
  if (status.path_ready) {
    done = true;
    window.location.href = `https://conv.dsh.yt/download/${taskId}`;
  }
}

Ciekawostki

  • Serwer automatycznie dobiera rozdzielczość wyjściową na podstawie docelowego bitrate — film może zostać przeskalowany w dół, jeśli bitrate jest zbyt niski dla oryginalnej rozdzielczości (minimum 0,0015 bitów na piksel).
  • Jeśli skompresowany plik przekroczy limit o więcej niż 8%, konwersja jest automatycznie powtarzana z niższym bitrate.
  • Pliki przechowywane są przez 10 minut — po tym czasie zostają usunięte z serwera.
  • Backend napisany w Pythonie z użyciem Flask i FFmpeg.
  • Serwis jest chroniony przez Cloudflare.