Les SDK officiels transforment tout le flux d’envoi reprenable
en un seul appel : uploadFile (JavaScript) / upload_file (Python). Ils créent
la session, découpent le fichier en chunks, les transfèrent dans l’ordre et
rapportent la progression — donc les grosses vidéos passent toutes seules.
L’appel unique
JavaScript / TypeScript (@videas/sdk)
import { createVideasClient } from '@videas/sdk'
const videas = createVideasClient({ apiKey: process.env.VIDEAS_API_KEY! })
const created = await videas.upload.uploadFile({
workspaceUid: 'ws_123',
filename: 'cours.mp4',
data: bytes, // un Blob/File, un ArrayBuffer ou un tableau typé
contentType: 'video/mp4', // optionnel
})
console.log('Nouvel asset :', created.asset_uid)
Python (videas-sdk)
from videas_sdk import VideasClient
client = VideasClient(api_key="sk_votre_cle_ici")
with open("cours.mp4", "rb") as fh:
created = client.upload.upload_file(
workspace_uid="ws_123",
filename="cours.mp4",
data=fh.read(),
content_type="video/mp4",
)
print("Nouvel asset :", created["asset_uid"])
Champs optionnels : assetName / asset_name, description, et
parentFolderUid / parent_folder_uid (envoyer dans un dossier plutôt qu’à la
racine du workspace).
Gros fichiers & progression
Le transfert est découpé automatiquement — 32 Mio par requête par défaut, bien sous la limite serveur de 50 Mio par chunk — donc les fichiers de plusieurs gigaoctets s’envoient sans effort. Ajustez la taille de chunk et suivez la progression :
await videas.upload.uploadFile({
workspaceUid: 'ws_123',
filename: 'film.mp4',
data: bytes,
chunkSize: 16 * 1024 * 1024, // optionnel — 32 Mio par défaut, doit rester ≤ 50 Mio
onProgress: (sent, total) => console.log(`${Math.round((sent / total) * 100)} %`),
})
client.upload.upload_file(
workspace_uid="ws_123",
filename="film.mp4",
data=data,
chunk_size=16 * 1024 * 1024, # optionnel — 32 Mio par défaut, doit rester <= 50 Mio
on_progress=lambda sent, total: print(f"{round(sent / total * 100)} %"),
)
Depuis le navigateur
uploadFile a besoin de votre clé secrète sk_ : exécutez-le sur votre
serveur — n’envoyez jamais la clé au navigateur. Pour un upload navigateur,
faites créer la session par votre serveur et laissez le navigateur envoyer les
octets vers l’URL-capacité renvoyée (sans clé) : voir
Uploads reprenables avec un client TUS.
Depuis un serveur (Node)
import { readFile } from 'node:fs/promises'
const bytes = await readFile('film.mp4')
await videas.upload.uploadFile({ workspaceUid: 'ws_123', filename: 'film.mp4', data: bytes })
Attendre que l’asset soit prêt
uploadFile renvoie les métadonnées créées (dont asset_uid)
immédiatement — la vidéo est ensuite traitée de façon asynchrone. Interrogez
l’asset jusqu’à ce qu’il soit prêt avant de le lire ou l’intégrer :
let asset = await videas.assets.get(created.asset_uid!)
while (asset.status !== 'ready' && asset.status !== 'error') {
await new Promise((r) => setTimeout(r, 3000))
asset = await videas.assets.get(created.asset_uid!)
}
Gestion des erreurs
Tout échec lève une erreur typée VideasApiError (JS) / VideasAPIError
(Python) portant le status HTTP, le code et le body. Si vous réglez
chunkSize au-dessus de la limite serveur, vous obtiendrez un message clair
« chunk too large » qui nomme la
limite de 50 Mio par chunk —
réduisez la taille de chunk (ou omettez-la pour utiliser la valeur par défaut).
Limitations
- Pas encore de reprise entre appels. L’envoi est découpé, mais un appel interrompu repart du premier chunk ; reprendre une session partiellement envoyée n’est pas encore exposé. Pour une logique de reprise sur mesure, pilotez le transfert avec un client TUS — voir Envoyer avec l’API REST.