Vidtreo
Integrações

Componente Web

Use VIDTREO com qualquer framework ou HTML vanilla usando o elemento personalizado.

Web Component

O pacote @vidtreo/recorder-wc fornece um Web Component agnóstico de framework que funciona com Vue, Angular, Svelte ou HTML puro.

Instalação

Via npm

npm install @vidtreo/recorder-wc

Via CDN (Sem Build)

<script type="module" src="https://cdn.jsdelivr.net/npm/@vidtreo/recorder-wc@latest/dist/vidtreo-recorder.js"></script>

Uso Básico

HTML

<!DOCTYPE html>
<html>
<head>
  <script type="module" src="https://cdn.jsdelivr.net/npm/@vidtreo/recorder-wc@latest/dist/vidtreo-recorder.js"></script>
</head>
<body>
  <vidtreo-recorder
    api-key="sua-api-key"
    lang="pt"
  ></vidtreo-recorder>

  <script>
    const recorder = document.querySelector('vidtreo-recorder');

    recorder.addEventListener('upload-complete', (event) => {
      console.log('URL do Vídeo:', event.detail.uploadUrl);
      console.log('ID da Gravação:', event.detail.recordingId);
    });

    recorder.addEventListener('error', (event) => {
      console.error('Erro:', event.detail);
    });
  </script>
</body>
</html>

Vue.js

<template>
  <vidtreo-recorder
    :api-key="apiKey"
    lang="pt"
    @upload-complete="handleUploadComplete"
    @error="handleError"
  />
</template>

<script setup>
import '@vidtreo/recorder-wc';

const apiKey = import.meta.env.VITE_VIDTREO_API_KEY;

function handleUploadComplete(event) {
  console.log('URL do Vídeo:', event.detail.uploadUrl);
}

function handleError(event) {
  console.error('Erro:', event.detail);
}
</script>

Angular

// app.module.ts
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import '@vidtreo/recorder-wc';

@NgModule({
  schemas: [CUSTOM_ELEMENTS_SCHEMA],
  // ...
})
export class AppModule {}
<!-- recorder.component.html -->
<vidtreo-recorder
  [attr.api-key]="apiKey"
  lang="pt"
  (upload-complete)="onUploadComplete($event)"
  (error)="onError($event)"
></vidtreo-recorder>

Svelte

<script>
  import '@vidtreo/recorder-wc';

  const apiKey = import.meta.env.VITE_VIDTREO_API_KEY;

  function handleUploadComplete(event) {
    console.log('URL do Vídeo:', event.detail.uploadUrl);
  }

  function handleError(event) {
    console.error('Erro:', event.detail);
  }
</script>

<vidtreo-recorder
  api-key={apiKey}
  lang="pt"
  on:upload-complete={handleUploadComplete}
  on:error={handleError}
/>

Atributos

Todos os atributos usam kebab-case (convenção HTML):

AtributoTipoPadrãoDescrição
api-keystringobrigatórioSua API key do VIDTREO
backend-urlstringhttps://core.vidtreo.comEndpoint da API
countdown-durationnumber3000Contagem regressiva (ms)
max-recording-timenumberundefinedDuração máxima (ms)
user-metadatastringundefinedJSON string de metadados
enable-source-switchingbooleantrueAlternar câmera/tela
enable-mutebooleantrueBotão de mudo
enable-pausebooleantruePausar/retomar
enable-device-changebooleantrueSeleção de dispositivos
mobile-modestring"overlay"Modo móvel: "overlay", "embed", "native"
langstring"en"Idioma da UI
textsstringundefinedJSON string de textos personalizados

Definir Atributos Dinamicamente

const recorder = document.querySelector('vidtreo-recorder');

// Atributos simples
recorder.setAttribute('lang', 'pt');
recorder.setAttribute('max-recording-time', '120000');

// Atributos JSON (metadados e textos)
recorder.setAttribute('user-metadata', JSON.stringify({
  userId: 'user-123',
  sessionId: 'session-456'
}));

recorder.setAttribute('texts', JSON.stringify({
  record: 'Iniciar Captura',
  stop: 'Finalizar Captura'
}));

Eventos

Escute eventos usando addEventListener ou sintaxe específica do framework:

EventoDetalheDescrição
recording-start{}Gravação iniciada
recording-stop{}Gravação parada
upload-progress{ progress: number }Progresso do upload (0-1)
upload-complete{ uploadUrl, recordingId }Upload finalizado
upload-error{ error: Error }Upload falhou
error{ error: Error }Qualquer erro

Exemplos de Eventos

const recorder = document.querySelector('vidtreo-recorder');

recorder.addEventListener('recording-start', () => {
  console.log('Gravação iniciada');
});

recorder.addEventListener('recording-stop', () => {
  console.log('Gravação parada');
});

recorder.addEventListener('upload-progress', (e) => {
  const percent = Math.round(e.detail.progress * 100);
  console.log(`Progresso do upload: ${percent}%`);
});

recorder.addEventListener('upload-complete', (e) => {
  console.log('URL do Vídeo:', e.detail.uploadUrl);
  console.log('ID da Gravação:', e.detail.recordingId);
});

recorder.addEventListener('error', (e) => {
  console.error('Erro:', e.detail.error);
});

Métodos

Controle o gravador programaticamente:

const recorder = document.querySelector('vidtreo-recorder');

// Iniciar prévia da câmera
await recorder.startCamera();

// Controles de gravação
await recorder.startRecording();
await recorder.stopRecording();
recorder.pauseRecording();
recorder.resumeRecording();

// Controles de fonte
await recorder.toggleSource();  // Trocar câmera/tela
recorder.toggleMute();

// Controles de dispositivos
await recorder.handleCameraChange('device-id');
await recorder.handleMicChange('device-id');

// Painel de configurações
recorder.toggleSettings();

// Reprodução de vídeo (após gravar)
recorder.playVideo();
recorder.downloadVideo();

// Processar vídeo (transcodificação)
await recorder.processVideo();

Estilos

O Web Component é renderizado no light DOM (sem Shadow DOM), então sua estrutura pode ser estilizada com CSS normal. Estilize o container:

vidtreo-recorder {
  /* Dimensões do container */
  width: 100%;
  max-width: 640px;
  height: 480px;

  /* Estilos do container */
  display: block;
  border-radius: 12px;
  overflow: hidden;
  box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
}

Propriedades CSS Personalizadas (Em Breve)

vidtreo-recorder {
  --vidtreo-primary-color: #3b82f6;
  --vidtreo-background: #1f2937;
  --vidtreo-text-color: #ffffff;
  --vidtreo-border-radius: 8px;
}

Internacionalização

Idiomas Integrados

<!-- Inglês (padrão) -->
<vidtreo-recorder api-key="..." lang="en"></vidtreo-recorder>

<!-- Espanhol -->
<vidtreo-recorder api-key="..." lang="es"></vidtreo-recorder>

<!-- Português -->
<vidtreo-recorder api-key="..." lang="pt"></vidtreo-recorder>

Textos Personalizados

<vidtreo-recorder
  api-key="..."
  lang="pt"
  texts='{"record": "Iniciar Captura", "stop": "Finalizar Captura", "uploading": "Enviando..."}'
></vidtreo-recorder>

Chaves de Texto Disponíveis

ChavePadrão (Português)
titleGravar Vídeo
subtitleClique em gravar para começar
initializingCameraInicializando câmera...
grantPermissionsPor favor conceda permissões de câmera
retryCameraTentar Novamente
switchingDeviceTrocando dispositivo...
recordingStartsInA gravação começa em
switchingSourceTrocando fonte...
recREC
settingsConfigurações
recordGravar
stopParar
pausePausar
resumeRetomar
muteSilenciar
unmuteAtivar Áudio
switchSourceTrocar Fonte
cameraCâmera
microphoneMicrofone
processVideoProcessar Vídeo
processingProcessando...
uploadingEnviando...
switchingCameraTrocando câmera...
switchingMicrophoneTrocando microfone...
failedToStartCameraFalha ao iniciar câmera

Exemplo Completo

<!DOCTYPE html>
<html lang="pt">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Gravador de Vídeo</title>
  <script type="module" src="https://cdn.jsdelivr.net/npm/@vidtreo/recorder-wc@latest/dist/vidtreo-recorder.js"></script>
  <style>
    body {
      font-family: system-ui, sans-serif;
      max-width: 800px;
      margin: 0 auto;
      padding: 2rem;
    }

    vidtreo-recorder {
      width: 100%;
      max-width: 640px;
      height: 480px;
      display: block;
      margin: 0 auto;
      border-radius: 12px;
      overflow: hidden;
    }

    .result {
      margin-top: 2rem;
      text-align: center;
    }

    .result video {
      max-width: 100%;
      border-radius: 8px;
    }

    .progress {
      margin-top: 1rem;
      text-align: center;
    }

    .hidden {
      display: none;
    }
  </style>
</head>
<body>
  <h1>Grave seu Vídeo</h1>

  <vidtreo-recorder
    id="recorder"
    api-key="sua-api-key"
    enable-source-switching="true"
    enable-mute="true"
    enable-pause="true"
    enable-device-change="true"
    max-recording-time="120000"
    countdown-duration="3000"
    lang="pt"
  ></vidtreo-recorder>

  <div id="progress" class="progress hidden">
    <p>Enviando: <span id="percent">0</span>%</p>
  </div>

  <div id="result" class="result hidden">
    <h2>Gravação Completa!</h2>
    <video id="video" controls></video>
    <p><a id="link" href="#" target="_blank">Abrir em nova aba</a></p>
  </div>

  <script>
    const recorder = document.getElementById('recorder');
    const progress = document.getElementById('progress');
    const percent = document.getElementById('percent');
    const result = document.getElementById('result');
    const video = document.getElementById('video');
    const link = document.getElementById('link');

    recorder.addEventListener('recording-start', () => {
      result.classList.add('hidden');
    });

    recorder.addEventListener('upload-progress', (e) => {
      progress.classList.remove('hidden');
      percent.textContent = Math.round(e.detail.progress * 100);
    });

    recorder.addEventListener('upload-complete', (e) => {
      progress.classList.add('hidden');
      result.classList.remove('hidden');
      video.src = e.detail.uploadUrl;
      link.href = e.detail.uploadUrl;
    });

    recorder.addEventListener('error', (e) => {
      progress.classList.add('hidden');
      alert('Erro: ' + e.detail.error.message);
    });
  </script>
</body>
</html>

Suporte TypeScript

Para projetos TypeScript, adicione declarações de tipos:

declare global {
  namespace JSX {
    interface IntrinsicElements {
      'vidtreo-recorder': React.DetailedHTMLProps<
        React.HTMLAttributes<HTMLElement> & {
          'api-key'?: string;
          'backend-url'?: string;
          'countdown-duration'?: string;
          'max-recording-time'?: string;
          'user-metadata'?: string;
          'enable-source-switching'?: string;
          'enable-mute'?: string;
          'enable-pause'?: string;
          'enable-device-change'?: string;
          'lang'?: string;
          'texts'?: string;
        },
        HTMLElement
      >;
    }
  }
}

Próximos Passos

Nesta página