Procédure : Charger (de base)

Introduction

Nous avons maintenant atteint une étape passionnante de notre parcours d’intégration : charger des asset vers Frame.io. Ce Guide vous accompagnera tout au long du processus de chargement de base.

Conditions préalables

Si ce n’est pas déjà fait, veuillez consulter le Guide Implémentation C2C : Configuration avant de continuer. Vous aurez besoin du access_token obtenu pendant le processus d’authentification et d’autorisation. Pour ce Guide, nous utiliserons un asset test d’exemple disponible sur ce lien Frame.io. Téléchargez ce fichier pour suivre nos exemples, car cela vous permettra de faire correspondre les valeurs de nos commandes d’exemple.

Étape 1 : Créer un asset

Chargeons notre fichier d’exemple, qui a été créé il y a 10 secondes selon nos hypothèses. Nous devons d’abord créer une référence d’asset dans Frame.io :

${
>curl -X POST https://api.frame.io/v2/devices/assets \
> --header 'Authorization: Bearer [access_token]' \
> --header 'Content-Type: application/json' \
> --header 'x-client-version: 2.0.0' \
> --data-binary @- <<'__JSON__'
> {
> "name": "C2C_TEST_CLIP.mp4",
> "filetype": "video/mp4",
> "filesize": 21136250,
> "offset": 10
> }
>__JSON__
>} | python -m json.tool
Spécification du point d'entrée API

La documentation pour /v2/devices/assets se trouve ici. Bien que le point d’entrée hérité /v2/assets fonctionne encore, nous recommandons aux nouvelles intégrations d’utiliser /v2/devices/assets.

Encodage JSON

Contrairement aux points d’entrée d’authentification que nous avons utilisés précédemment, ce point d’entrée accepte l’encodage application/json plutôt que form/multipart. Il accepte également application/x-www-form-urlencoded.

Syntaxe de commande

Cet exemple utilise heredoc pour fournir la charge JSON à curl dans un format multiligne lisible. Le paramètre --data-binary @- indique à curl de lire les données brutes depuis stdin. En savoir plus sur cette approche ici.

Examinons les paramètres de la charge JSON :

name : Le nom d’asset affiché dans Frame.io. Il n’est pas nécessaire que ceci corresponde au nom du fichier sur le disque. filetype : Le type MIME du fichier. La plupart des langages de programmation fournissent des utilitaires pour la détection du type MIME (exemples : Go, Python). filesize : La taille du fichier en octets. Notre fichier d’exemple fait environ 21,1 Mo. offset : Le nombre de secondes depuis la création du fichier. Par défaut à 0 si omis. Ce paramètre doit être fourni car il aide à déterminer si les fichiers doivent être rejetés en raison de la mise en pause de l’appareil. Nous couvrirons ceci plus en détail dans le guide de chargement avancé.

La réponse ressemblera à ceci (avec certains champs omis) :

1{
2 "_type": "file",
3 ...
4 "id": "9a280f99-8f4f-46b0-a4b4-ec4c2f95138e",
5 ...
6 "upload_urls": [
7 "https://frameio-uploads-production.s3-accelerate.amazonaws.com/parts/[part_01_path]",
8 "https://frameio-uploads-production.s3-accelerate.amazonaws.com/parts/[part_02_path]"
9 ],
10 ...
11}

À ce stade, nous avons seulement informé Frame.io de notre intention de charger un fichier ; aucune donnée de fichier réelle n’a été transférée. Si vous vérifiez le dossier de votre appareil dans votre Projet, vous verrez un fichier d’espace réservé dans l’état « chargement en cours ».

Le champ upload_urls contient les URL où nous chargerons nos fragments de fichier. Pour notre fichier test, nous devrions recevoir deux URL de chargement.

Étape 2 : Division du fichier en fragments

La réponse contenait plusieurs URL de chargement. Lors du chargement vers Frame.io, nous divisons les fichiers en fragments et les chargeons séparément, ce qui présente plusieurs avantages :

  • Fiabilité améliorée : Si un fragment échoue, nous n’avons pas besoin de redémarrer tout le chargement
  • Chargements plus rapides : Nous pouvons charger plusieurs fragments en parallèle (couvert dans le guide de chargements avancés)

Pour déterminer la taille de fragment optimale, utilisez cette formule :

Python
1# We use math.ceil() to ensure we get the upper bound in the division
2chunk_size = math.ceil(float(file.size) / float(len(response.upload_urls)))

Pour notre fichier d’exemple, le calcul est :

Python
1math.ceil(21136250 / 2)
2# 10568125

Cela signifie que chaque fragment devrait faire 10 568 125 octets. Les tailles de fragments ciblent généralement environ 25 Mo, avec les calculs exacts couverts dans le guide de chargements avancés.

Taille du dernier segment

Étant donné que les tailles de fichier se divisent rarement de manière égale, le dernier segment peut être plus petit que la chunk_size calculée.Votre implémentation doit en tenir compte lors de la lecture des segments de fichier.

Pour cette démonstration, nous utiliserons les commandes HEAD et tail pour extraire les segments de fichier.

Étape 3 : Chargement des segments

Pour charger le premier segment :

$head -c 10568125 ~/Downloads/C2C_TEST_CLIP.mp4 | \
>curl -X PUT https://frameio-uploads-production.s3-accelerate.amazonaws.com/parts/[part_01_path] \
> --include \
> --header 'content-type: video/mp4' \
> --header 'x-amz-acl: private' \
> --data-binary @-
Syntaxe de la commande

Le paramètre --data-binary @- indique à curl d’utiliser des données brutes depuis stdin, qui proviennent de la commande HEAD.

La requête nécessite ces en-têtes :

content-type : La même valeur de type MIME utilisée lors de la création du fichier x-amz-acl : Pour les autorisations AWS S3, toujours défini sur private

Un chargement réussi renvoie :

HTTP/1.1 100 Continue
HTTP/1.1 200 OK
...

De même, chargez le deuxième segment :

$tail -c 10568125 ~/Downloads/C2C_TEST_CLIP.mp4 | \
>curl -X PUT https://frameio-uploads-production.s3-accelerate.amazonaws.com/parts/[part_02_path] \
> --include \
> --header 'content-type: video/mp4' \
> --header 'x-amz-acl: private' \
> --data-binary @-

Une fois les deux chargements terminés, votre fichier devrait être lisible dans Frame.io !🎉

Erreurs de chargement

Lors du chargement de segments, vous envoyez des données directement à AWS S3, pas à l’API Frame.io.Les réponses d’erreur suivront les formats AWS S3 plutôt que les erreurs Frame.io standard.Nous aborderons la gestion des erreurs S3 dans le Guide de gestion des erreurs.

Ordre des segments

Bien qu’il soit conceptuellement plus simple de charger les segments de manière séquentielle, ils peuvent en réalité être chargés dans n’importe quel ordre.Le système les assemblera correctement quelle que soit la séquence de chargement.

Assemblage final

Voici un exemple simplifié de pseudocode Python pour le processus de chargement complet :

Python
1file = open("~/Downloads/C2C_TEST_CLIP.mp4")
2mimetype = mimetypes.for_file("~/Downloads/C2C_TEST_CLIP.mp4")[0]
3created_at = time.ctime(file.stat.ST_CTIME)
4
5asset = c2c.asset_create(
6 name="C2C_TEST_CLIP.mp4",
7 filetype=mimetype,
8 filesize=file.size,
9 offset=datetime.now() - created_at,
10 channel=0,
11)
12
13chunk_size = math.ceil(float(file.size) / float(len(asset.upload_urls)))
14
15for chunk_url in asset.upload_urls:
16 chunk = file.read(bytes=chunk_size)
17 c2c.upload_chunk(chunk, chunk_url, mimetype)

Cet exemple démontre le flux de base sans gestion d’erreur ni chargements parallèles, qui seront abordés dans les guides gestion des erreurs et chargements avancés.

Étapes suivantes

Félicitations pour avoir réussi à charger votre premier asset sur Frame.io !Le Guide de chargement avancé couvrira des techniques plus sophistiquées et les exigences pour les implémentations prêtes pour la production.Nous vous encourageons à contacter notre équipe pour toute question et à consulter le Guide de chargement en temps réel pour apprendre à charger des asset pendant leur création.