{"id":14331,"date":"2022-08-09T14:19:47","date_gmt":"2022-08-09T17:19:47","guid":{"rendered":"https:\/\/jmvstream.com\/video-upload\/"},"modified":"2022-08-09T15:45:14","modified_gmt":"2022-08-09T18:45:14","slug":"video-upload","status":"publish","type":"post","link":"https:\/\/jmvstream.com\/en\/development\/video-upload\/","title":{"rendered":"Video upload"},"content":{"rendered":"<div class=\"wpb-content-wrapper\"><p>[vc_row][vc_column][vc_column_text]The upload of videos is initiated through a POST request in the route &lt;code&gt;\/v1\/videos&lt;\/code&gt; This route will only be used to create the upload, and not for the upload itself. From the call of this route, data will be returned in the HEADERS of the response that will be used to perform the upload.<\/p>\n<p>&nbsp;<\/p>\n<p>The upload itself will be done via the \/v1\/videos\/uploads\/:id route<\/p>\n<p>&nbsp;<\/p>\n<p>Currently the API does not accept more than one upload at a time.[\/vc_column_text][\/vc_column][\/vc_row][vc_row apply_row_margin=&#8221;top_bottom&#8221; row_margin_top_bottom=&#8221;30px&#8221;][vc_column][vc_column_text]<\/p>\n<h1 style=\"text-align: center;\">Creating the Upload &#8211; POST<\/h1>\n<p>[\/vc_column_text][\/vc_column][\/vc_row][vc_row apply_row_margin=&#8221;top_bottom&#8221; row_margin_top_bottom=&#8221;15px&#8221;][vc_column][vc_column_text]<\/p>\n<h2>Route<\/h2>\n<p>[\/vc_column_text][inova_raw_html]<\/p>\n<table class=\"table\">\n<thead>\n<tr>\n<th scope=\"col\">Method<\/th>\n<th scope=\"col\">Route<\/th>\n<th scope=\"col\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>POST<\/td>\n<td><code>\/v1\/videos<\/code><\/td>\n<td>Route for creating the upload.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>[\/inova_raw_html][vc_column_text]* Token generated by the <a href=\"\/en\/developer\/getting-started\/authentication\/\" target=\"_blank\" rel=\"noopener\">authentication route<\/a>[\/vc_column_text][\/vc_column][\/vc_row][vc_row apply_row_margin=&#8221;top_bottom&#8221; row_margin_top_bottom=&#8221;15px&#8221;][vc_column][vc_column_text]<\/p>\n<h2>Headers<\/h2>\n<p>[\/vc_column_text][inova_raw_html]<\/p>\n<table>\n<thead>\n<tr>\n<th scope=\"col\">Param<\/th>\n<th scope=\"col\">Type<\/th>\n<th scope=\"col\">Description<\/th>\n<th scope=\"col\">Required<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Tus-Resumable<\/td>\n<td><code>String<\/code><\/td>\n<td>TUS protocol version. Always send 1.0.0<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>Upload-Length<\/td>\n<td><code>Number<\/code><\/td>\n<td>Size of the file to be uploaded (In bytes).<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>Upload-Metadata<\/td>\n<td><code>String<\/code><\/td>\n<td>&#8220;filename&#8221; followed by the base64 filename.<br \/>\nEx.: File name: test_converted=&gt; Upload-Metadata: filename dGVzdGUubXA0.<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>Content-Type<\/td>\n<td><code>String<\/code><\/td>\n<td>application\/json<\/td>\n<td>No<\/td>\n<\/tr>\n<tr>\n<td>gallery<\/td>\n<td><code>String<\/code><\/td>\n<td>Uuid of the gallery that will be uploaded later.<\/td>\n<td>No<\/td>\n<\/tr>\n<tr>\n<td>Authorization<\/td>\n<td><code>String<\/code><\/td>\n<td>Token authorization.<\/td>\n<td>Yes<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>[\/inova_raw_html][\/vc_column][\/vc_row][vc_row apply_row_margin=&#8221;individually&#8221; row_margin_bottom=&#8221;10px&#8221;][vc_column][vc_row_inner][vc_column_inner][vc_column_text]<\/p>\n<h2>Response<\/h2>\n<p>[\/vc_column_text][\/vc_column_inner][\/vc_row_inner][vc_row_inner][vc_column_inner][vc_column_text]- Response when performing an upload (Status: 201)[\/vc_column_text][inova_raw_html]<\/p>\n<table class=\"table\">\n<thead>\n<tr>\n<th scope=\"col\">Name<\/th>\n<th scope=\"col\">Value<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>X-Powered-By<\/td>\n<td>Express<\/td>\n<\/tr>\n<tr>\n<td>Tus-Resumable<\/td>\n<td>1.0.0<\/td>\n<\/tr>\n<tr>\n<td>Access-Control-Expose-Headers<\/td>\n<td>Authorization, Content-Type, Location, Tus-Extension, Tus-Max-Size, Tus-Resumable, Tus-Version, Upload-Defer-Length, Upload-Length, Upload-Metadata, Upload-Offset, X-HTTP-Method-Override, X-Requested-With<\/td>\n<\/tr>\n<tr>\n<td>Location<\/td>\n<td>\/\/localhost:15214\/v1\/videos\/uploads\/410b471ac3ed2ee0f8856e7aa4358ba4<\/td>\n<\/tr>\n<tr>\n<td>Content-Length<\/td>\n<td>0<\/td>\n<\/tr>\n<tr>\n<td>Date<\/td>\n<td>Tue, 21 Jun 2022 13:09:10 GMT<\/td>\n<\/tr>\n<tr>\n<td>Connection<\/td>\n<td>keep-alive<\/td>\n<\/tr>\n<tr>\n<td>Keep-Alive<\/td>\n<td>timeout=5<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>[\/inova_raw_html][\/vc_column_inner][\/vc_row_inner][vc_row_inner][vc_column_inner][vc_column_text]- Error response when not sending required field or field in incorrect format (Status: 400)[\/vc_column_text][vc_column_text]<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"json\">{\r\n   \"error\": \"Bad Request\"\r\n}<\/pre>\n<p>[\/vc_column_text][\/vc_column_inner][\/vc_row_inner][vc_row_inner][vc_column_inner][vc_column_text]- Error response when trying to perform more uploads at a time per application (Status: 429)[\/vc_column_text][vc_column_text]<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"json\">{\r\n   \"error\": \"Too many simultaneous uploads, please send one file at a time\"\r\n}<\/pre>\n<p>[\/vc_column_text][\/vc_column_inner][\/vc_row_inner][vc_row_inner][vc_column_inner][vc_column_text]- Error response for some internal error (Status: 500)[\/vc_column_text][vc_column_text]<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"json\">{\r\n  \"error\": \"Internal Server Error\"\r\n}<\/pre>\n<p>[\/vc_column_text][\/vc_column_inner][\/vc_row_inner][\/vc_column][\/vc_row][vc_row apply_row_margin=&#8221;top_bottom&#8221; row_margin_top_bottom=&#8221;30px&#8221;][vc_column][vc_column_text]<\/p>\n<h1 style=\"text-align: center;\">Upload &#8211; PATCH<\/h1>\n<p>[\/vc_column_text][\/vc_column][\/vc_row][vc_row apply_row_margin=&#8221;top_bottom&#8221; row_margin_top_bottom=&#8221;15px&#8221;][vc_column][vc_column_text]<\/p>\n<h2>Route<\/h2>\n<p>[\/vc_column_text][inova_raw_html]<\/p>\n<table class=\"table\">\n<thead>\n<tr>\n<th scope=\"col\">Method<\/th>\n<th scope=\"col\">Route<\/th>\n<th scope=\"col\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>PATCH<\/td>\n<td><code>\/v1\/videos\/uploads\/:id<\/code><\/td>\n<td>Route to upload.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>[\/inova_raw_html][vc_column_text]<strong>NOTE:<\/strong> In this request, the video specified in Upload-Metadata must be passed in its binary form. As an example, in Insomnia, it would be selecting the &#8216;file&#8217; option, and then selecting the &#8216;Binary file&#8217; option, and then selecting the desired file.[\/vc_column_text][\/vc_column][\/vc_row][vc_row apply_row_margin=&#8221;top_bottom&#8221; row_margin_top_bottom=&#8221;15px&#8221;][vc_column][vc_column_text]<\/p>\n<h2>Headers<\/h2>\n<p>[\/vc_column_text][inova_raw_html]<\/p>\n<table class=\"table\">\n<thead>\n<tr>\n<th scope=\"col\">Param<\/th>\n<th scope=\"col\">Type<\/th>\n<th scope=\"col\">Description<\/th>\n<th scope=\"col\">Required<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Tus-Resumable<\/td>\n<td><code>String<\/code><\/td>\n<td>TUS protocol version. Always send 1.0.0<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>Content-Length<\/td>\n<td><code>Number<\/code><\/td>\n<td>Amount in bytes remaining to be uploaded.<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>Upload-Offset<\/td>\n<td><code>Number<\/code><\/td>\n<td>Initial byte for the upload (If it is the first request, it must start with 0, if the upload has been interrupted, the upload must continue where it left off, this information is provided by the Upload-Offset parameter returned in the HEAD \/ v1\/videos\/uploads\/:id).<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>Upload-Metadata<\/td>\n<td><code>String<\/code><\/td>\n<td>&#8220;filename&#8221; followed by the base64 filename. Ex.: File name: test_converted=&gt; Upload-Metadata: filename dGVzdGUubXA0.<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>Content-Type<\/td>\n<td><code>String<\/code><\/td>\n<td>application\/offset+octet-stream<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>gallery<\/td>\n<td><code>String<\/code><\/td>\n<td>Uuid of the gallery that will be uploaded later.<\/td>\n<td>No<\/td>\n<\/tr>\n<tr>\n<td>Authorization<\/td>\n<td><code>String<\/code><\/td>\n<td>Token authorization.<\/td>\n<td>Yes<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>[\/inova_raw_html][\/vc_column][\/vc_row][vc_row apply_row_margin=&#8221;individually&#8221; row_margin_bottom=&#8221;10px&#8221;][vc_column][vc_row_inner][vc_column_inner][vc_column_text]<\/p>\n<h2>Response<\/h2>\n<p>[\/vc_column_text][\/vc_column_inner][\/vc_row_inner][vc_row_inner][vc_column_inner][vc_column_text]<\/p>\n<h4>&#8211; Response header when uploading (Status: 201)<\/h4>\n<p>[\/vc_column_text][inova_raw_html]<\/p>\n<table class=\"table\">\n<thead>\n<tr>\n<th scope=\"col\">Name<\/th>\n<th scope=\"col\">Value<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>X-Powered-By<\/td>\n<td>Express<\/td>\n<\/tr>\n<tr>\n<td>Tus-Resumable<\/td>\n<td>1.0.0<\/td>\n<\/tr>\n<tr>\n<td>Access-Control-Expose-Headers<\/td>\n<td>Authorization, Content-Type, Location, Tus-Extension, Tus-Max-Size, Tus-Resumable, Tus-Version, Upload-Defer-Length, Upload-Length, Upload-Metadata, Upload-Offset, X-HTTP-Method-Override, X-Requested-With<\/td>\n<\/tr>\n<tr>\n<td>Location<\/td>\n<td>\/\/localhost:15214\/v1\/videos\/uploads\/410b471ac3ed2ee0f8856e7aa4358ba4<\/td>\n<\/tr>\n<tr>\n<td>Content-Length<\/td>\n<td>0<\/td>\n<\/tr>\n<tr>\n<td>Date<\/td>\n<td>Tue, 21 Jun 2022 13:09:10 GMT<\/td>\n<\/tr>\n<tr>\n<td>Connection<\/td>\n<td>keep-alive<\/td>\n<\/tr>\n<tr>\n<td>Keep-Alive<\/td>\n<td>timeout=5<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>[\/inova_raw_html][\/vc_column_inner][\/vc_row_inner][vc_row_inner][vc_column_inner][vc_column_text]<\/p>\n<h4>&#8211; Error response when not uploading-metadata correctly (Status: 400)<\/h4>\n<p>[\/vc_column_text][vc_column_text]<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"json\">{\r\n    \"error\": \"Bad Request\"\r\n}<\/pre>\n<p>[\/vc_column_text][\/vc_column_inner][\/vc_row_inner][vc_row_inner][vc_column_inner][vc_column_text]<\/p>\n<h4>&#8211; Error response when trying to perform more uploads at a time per application (Status: 429)<\/h4>\n<p>[\/vc_column_text][vc_column_text]<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"json\">{\r\n    \"error\": \"Too many simultaneous uploads, please send one file at a time\"\r\n}<\/pre>\n<p>[\/vc_column_text][\/vc_column_inner][\/vc_row_inner][vc_row_inner][vc_column_inner][vc_column_text]<\/p>\n<h4>&#8211; Error response for some internal error (Status: 500)<\/h4>\n<p>[\/vc_column_text][vc_column_text]<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"json\">{\r\n  \"error\": \"Internal Server Error\"\r\n}<\/pre>\n<p>[\/vc_column_text][\/vc_column_inner][\/vc_row_inner][\/vc_column][\/vc_row][vc_row apply_row_margin=&#8221;top_bottom&#8221; row_margin_top_bottom=&#8221;30px&#8221;][vc_column][vc_column_text]<\/p>\n<h1 style=\"text-align: center;\">Returns information from the Upload &#8211; HEAD<\/h1>\n<p>[\/vc_column_text][\/vc_column][\/vc_row][vc_row apply_row_margin=&#8221;top_bottom&#8221; row_margin_top_bottom=&#8221;15px&#8221;][vc_column][vc_column_text]<\/p>\n<h2>Route<\/h2>\n<p>[\/vc_column_text][inova_raw_html]<\/p>\n<table class=\"table\">\n<thead>\n<tr>\n<th scope=\"col\">Method<\/th>\n<th scope=\"col\">Route<\/th>\n<th scope=\"col\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>PATCH<\/td>\n<td><code>\/v1\/videos\/uploads\/:id<\/code><\/td>\n<td>Route to upload.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>[\/inova_raw_html][\/vc_column][\/vc_row][vc_row apply_row_margin=&#8221;top_bottom&#8221; row_margin_top_bottom=&#8221;15px&#8221;][vc_column][vc_column_text]<\/p>\n<h2>Headers<\/h2>\n<p>[\/vc_column_text][inova_raw_html]<\/p>\n<table class=\"table\">\n<thead>\n<tr>\n<th scope=\"col\">Param<\/th>\n<th scope=\"col\">Type<\/th>\n<th scope=\"col\">Description<\/th>\n<th scope=\"col\">Required<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Authorization<\/td>\n<td><code>String<\/code><\/td>\n<td>Token authorization.<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>Tus-Resumable<\/td>\n<td><code>String<\/code><\/td>\n<td>TUS protocol version. Always send 1.0.0<\/td>\n<td>Yes<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>[\/inova_raw_html][\/vc_column][\/vc_row][vc_row apply_row_margin=&#8221;individually&#8221; row_margin_bottom=&#8221;10px&#8221;][vc_column][vc_row_inner][vc_column_inner][vc_column_text]<\/p>\n<h2>Response<\/h2>\n<p>[\/vc_column_text][\/vc_column_inner][\/vc_row_inner][vc_row_inner][vc_column_inner][vc_column_text]<strong>NOTE:<\/strong> The Upload_Offset parameter returned indicates how many bytes have already been sent, when the Upload-Offset is equal to the Upload-length, the upload is completed.[\/vc_column_text][\/vc_column_inner][\/vc_row_inner][vc_row_inner][vc_column_inner][vc_column_text]- Response header when uploading (Status: 201)[\/vc_column_text][inova_raw_html]<\/p>\n<table class=\"table\">\n<thead>\n<tr>\n<th scope=\"col\">Name<\/th>\n<th scope=\"col\">Value<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>X-Powered-By<\/td>\n<td>Express<\/td>\n<\/tr>\n<tr>\n<td>Tus-Resumable<\/td>\n<td>1.0.0<\/td>\n<\/tr>\n<tr>\n<td>Access-Control-Expose-Headers<\/td>\n<td>Authorization, Content-Type, Location, Tus-Extension, Tus-Max-Size, Tus-Resumable, Tus-Version, Upload-Defer-Length, Upload-Length, Upload-Metadata, Upload-Offset, X-HTTP-Method-Override, X-Requested-With<\/td>\n<\/tr>\n<tr>\n<td>Location<\/td>\n<td>\/\/localhost:15214\/v1\/videos\/uploads\/410b471ac3ed2ee0f8856e7aa4358ba4<\/td>\n<\/tr>\n<tr>\n<td>Content-Length<\/td>\n<td>0<\/td>\n<\/tr>\n<tr>\n<td>Date<\/td>\n<td>Tue, 21 Jun 2022 13:09:10 GMT<\/td>\n<\/tr>\n<tr>\n<td>Connection<\/td>\n<td>keep-alive<\/td>\n<\/tr>\n<tr>\n<td>Keep-Alive<\/td>\n<td>timeout=5<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>[\/inova_raw_html][\/vc_column_inner][\/vc_row_inner][vc_row_inner][vc_column_inner][vc_column_text]- Error response for some internal error (Status: 500)[\/vc_column_text][vc_column_text]<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"json\">{\r\n  \"error\": \"Internal Server Error\"\r\n}<\/pre>\n<p>[\/vc_column_text][\/vc_column_inner][\/vc_row_inner][\/vc_column][\/vc_row]<\/p>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>[vc_row][vc_column][vc_column_text]The upload of videos is initiated through a POST request in the route &lt;code&gt;\/v1\/videos&lt;\/code&gt; This<\/p>\n","protected":false},"author":39,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"documentation.php","format":"standard","meta":{"footnotes":""},"categories":[410,412],"tags":[],"class_list":["post-14331","post","type-post","status-publish","format-standard","hentry","category-development","category-videos"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/jmvstream.com\/en\/wp-json\/wp\/v2\/posts\/14331","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jmvstream.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jmvstream.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jmvstream.com\/en\/wp-json\/wp\/v2\/users\/39"}],"replies":[{"embeddable":true,"href":"https:\/\/jmvstream.com\/en\/wp-json\/wp\/v2\/comments?post=14331"}],"version-history":[{"count":0,"href":"https:\/\/jmvstream.com\/en\/wp-json\/wp\/v2\/posts\/14331\/revisions"}],"wp:attachment":[{"href":"https:\/\/jmvstream.com\/en\/wp-json\/wp\/v2\/media?parent=14331"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jmvstream.com\/en\/wp-json\/wp\/v2\/categories?post=14331"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jmvstream.com\/en\/wp-json\/wp\/v2\/tags?post=14331"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}