{"id":27939,"date":"2022-07-06T09:10:18","date_gmt":"2022-07-06T09:10:18","guid":{"rendered":"http:\/\/video-slideshows-with-cloudinary-and-laravel"},"modified":"2025-03-02T08:44:31","modified_gmt":"2025-03-02T16:44:31","slug":"video-slideshows-with-cloudinary-and-laravel","status":"publish","type":"post","link":"https:\/\/cloudinary.com\/blog\/guest_post\/video-slideshows-with-cloudinary-and-laravel\/","title":{"rendered":"Video Slideshows with Cloudinary &amp; Laravel"},"content":{"rendered":"<div class=\"wp-block-cloudinary-markdown \"><p>Cloudinary is a Software-as-a-Service (SaaS) solution for managing all your web or mobile application\u2019s media assets in the cloud. Cloudinary offers an end-to-end solution for all your image and video needs, including upload, storage, administration, transformation, and optimized delivery.\nLaravel is a PHP framework developed with developer productivity in mind. The framework also aims to evolve with the web and has already incorporated several new features and ideas in the web development world\u2014such as job queues, <strong>API authentication<\/strong> out of the box, real-time communication, and much more.<\/p>\n<h2>Introduction<\/h2>\n<p>Slideshows are the perfect addition to your media collection. They make your social media content engaging, fun, and memorable and are great for business promotional purposes. In this article, we will create a video slideshow using Laravel and Cloudinary.<\/p>\n<p>Some use cases for slideshows include:<\/p>\n<ul>\n<li>\n<p>Creating a personalized video of a user\u2019s recent items.<\/p>\n<\/li>\n<li>\n<p>Creating a personalized video of items a user left in their shopping cart.<\/p>\n<\/li>\n<li>\n<p>Creating a daily sale video of different products automatically.<\/p>\n<\/li>\n<li>\n<p>Creating a real-estate video out of apartment images.<\/p>\n<\/li>\n<\/ul>\n<p>The possibilities are endless since with dynamic transformations like Content-Aware Crop you can create video slideshows for your Instagram, WhatsApp, and TikTok Stories.<\/p>\n<p>Let\u2019s get started.<\/p>\n<h2>PHPSandbox and Github<\/h2>\n<p>The final project can be viewed on <a href=\"https:\/\/phpsandbox.io\/e\/x\/myfy4?layout=EditorPreview&amp;defaultPath=%2F&amp;theme=dark&amp;showExplorer=no\">PHPSandbox<\/a> and the entire source code is available on my <a href=\"https:\/\/github.com\/musebe\/laravel--cloudinary-video-slideshow\">Github<\/a> repository.<\/p>\n<h2>Prerequisites<\/h2>\n<p>Using Cloudinary in your Laravel projects is pretty straightforward. However, for you to be able to easily follow along,<\/p>\n<p>you need to have a good command of your terminal, Git, and entry knowledge of PHP specifically with the Laravel<\/p>\n<p>framework.<\/p>\n<h2>Getting Started<\/h2>\n<p>Being that Laravel is a PHP Framework, we will need Composer. Like any modern PHP framework, Laravel uses Composer to manage its dependencies. So, before we can<\/p>\n<p>start to ensure you have Composer installed on your machine. Follow step 1 below to install Composer and PHP.<\/p>\n<ol>\n<li>Install <a href=\"https:\/\/getcomposer.org\/\">Composer<\/a> and <a href=\"https:\/\/www.php.net\/manual\/en\/install.windows.tools.php\">PHP<\/a> on<\/li>\n<\/ol>\n<p>your development or production machine.<\/p>\n<ol start=\"2\">\n<li>\n<p>Install Laravel<\/p>\n<\/li>\n<li>\n<p>Via Composer:<\/p>\n<\/li>\n<\/ol>\n<p><code>composer create-project --prefer-dist laravel\/laravel cloudinary-video-slideshow<\/code><\/p>\n<ol start=\"2\">\n<li>Via Laravel Installer<\/li>\n<\/ol>\n<p>`composer global require laravel\/installer<\/p>\n<p><code>laravel new cloudinary-video-slideshow<\/code><\/p>\n<ol start=\"3\">\n<li>In step 2 above we have installed the Laravel Installer and used it to scaffold a new application in the folder <code>cloudinary-video-slideshow<\/code>. With Laravel installed, we should be able to start and test the server ensuring everything is okay. Change the directory to the project folder and run the local development server by typing the following commands:<\/li>\n<\/ol>\n<p><code>cd cloudinary-video-slideshow<\/code><\/p>\n<p><code>php artisan serve<\/code><\/p>\n<p>The Laravel project is now up and running. When you open <code>http:\/\/localhost:8000<\/code> on your computer, you should see the image below:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/dgrpkngjn\/image\/upload\/c_limit,w_2000\/f_auto\/q_auto\/v1655887283\/watermark-api\/assets\/laravel-running_zqk8ol.png\" alt=\"Laravel Server Running\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"1239\" height=\"638\"\/><\/p>\n<h2>Setting up Cloudinary\u2019s Laravel SDK<\/h2>\n<p>Cloudinary has a tonne of features from media upload, storage, administration, and manipulation to optimization and delivery. In this article, we will use Cloudinary Video Transformations to combine existing or newly uploaded media files to create a slideshow.<\/p>\n<ol>\n<li>Sign up for a free Cloudinary account then navigate to the Console page and take note of your Cloud name, API Key and<\/li>\n<\/ol>\n<p>API Secret.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/dgrpkngjn\/image\/upload\/c_limit,w_2000\/f_auto\/q_auto\/v1655976836\/assets\/cloudinary_dashboard.png\" alt=\"Cloudinary Dashboard\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"940\" height=\"441\"\/><\/p>\n<ol start=\"2\">\n<li>Install <a href=\"https:\/\/github.com\/cloudinary-labs\/cloudinary-laravel#installation\">Cloudinary\u2019s Laravel SDK<\/a>:<\/li>\n<\/ol>\n<p><code>composer require cloudinary-labs\/cloudinary-laravel<\/code><\/p>\n<p><strong>Note<\/strong>: Please ensure you follow all the steps in the #Installation section. Publish the configuration file and add<\/p>\n<p>the Cloudinary credentials you noted in Step 1 to the <code>.env<\/code> file.<\/p>\n<pre class=\"js-syntax-highlighted\"><code>\nCLOUDINARY_API_KEY=YOUR_CLOUDINARY_API_KEY\n\nCLOUDINARY_API_SECRET=YOUR_CLOUDINARY_API_SECRET\n\nCLOUDINARY_CLOUD_NAME=YOUR_CLOUDINARY_CLOUD_NAME\n\n<\/code><\/pre>\n<h2>Generating a Slideshow<\/h2>\n<p>There are two ways you can generate a slide show depending on your use case:<\/p>\n<ol>\n<li>Using a delivery URL &#8211; here you can use a template downloaded from Cloudinary to combine the relevant components in a delivery URL that looks as follows:<\/li>\n<\/ol>\n<p><code>https:\/\/res.cloudinary.com\/&lt;cloudname&gt;\/video\/upload\/fn_render:&lt;global-settings&gt;;vars_(&lt;slide-settings&gt;(&lt;individual-slide&gt;))\/&lt;global-transformations&gt;\/&lt;template&gt;.&lt;ext&gt;<\/code><\/p>\n<ol start=\"2\">\n<li>Using the Upload API &#8211; this is the technique we will use in this article. We will use the <code>create_slideshow<\/code> method of the Upload API. This will create a new video in your Cloudinary account based on the parameters provided.<\/li>\n<\/ol>\n<h2>Multiple File Upload with Livewire<\/h2>\n<p>To generate a video slideshow we will need a UI (User Interface), we will use the Laravel package Livewire to build this.<\/p>\n<ol>\n<li>Install Livewire Package by running the following command in your Laravel project:<\/li>\n<\/ol>\n<p><code>composer require livewire\/livewire<\/code><\/p>\n<ol start=\"2\">\n<li>Include Livewire scripts and styles on every page that will be using Livewire. In our case <code>welcome.blade.php<\/code>:<\/li>\n<\/ol>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml shcb-wrap-lines\">\n...\n\n@livewireStyles\n\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">head<\/span>&gt;<\/span>\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">body<\/span>&gt;<\/span>\n\n...\n\n@livewireScripts\n\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">body<\/span>&gt;<\/span>\n\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">html<\/span>&gt;<\/span>\n\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<ol start=\"3\">\n<li>We will then create a Livewire Component to handle our image uploads:<\/li>\n<\/ol>\n<p><code>php artisan make:livewire MultipleFileUpload<\/code><\/p>\n<p>This will create two files, first <code>app\/Http\/Livewire\/MultipleFileUpload.php<\/code> and the other one<\/p>\n<p>in <code>resources\/views\/livewire\/multiple-file-upload.blade.php<\/code><\/p>\n<p>Now you can use this component anywhere in your Laravel project using the following snippet:<\/p>\n<p><code>&lt;livewire:multiple-file-upload\/&gt;<\/code><\/p>\n<p>or<\/p>\n<p><code>@livewire('multiple-file-upload')<\/code><\/p>\n<ol start=\"3\">\n<li>Open <code>resources\/views\/welcome.blade.php<\/code> and add the following code within the <code>&lt;body&gt;&lt;\/body&gt;<\/code> tags as shown below:<\/li>\n<\/ol>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml shcb-wrap-lines\">\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">body<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"antialiased\"<\/span>&gt;<\/span>\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n\n@livewire('multiple-file-upload')\n\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">body<\/span>&gt;<\/span>\n\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>This includes the Livewire component we created earlier in our <code>welcome.blade.php<\/code>.<\/p>\n<p><strong>Note:<\/strong> Please ensure you go through the <a href=\"https:\/\/laravel-livewire.com\/docs\/2.x\/quickstart\">Livewire documentation<\/a>, to learn how to install and set it up.<\/p>\n<ol start=\"3\">\n<li>Open the file <code>resources\/views\/livewire\/multiple-file-upload.blade.php<\/code> and populate it with the following code:<\/li>\n<\/ol>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\">\n&lt;form <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span><\/span>=<span class=\"hljs-string\">\"mb-5\"<\/span>  wire:submit.prevent=<span class=\"hljs-string\">\"uploadFiles\"<\/span>&gt;\n\n<span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"form-group row mt-5 mb-3\"<\/span>&gt;<\/span>\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"input-group\"<\/span>&gt;<\/span>\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">input<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">\"file\"<\/span>  <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"form-control @error('files'|'files.*') is-invalid @enderror\"<\/span>  <span class=\"hljs-attr\">placeholder<\/span>=<span class=\"hljs-string\">\"Choose files...\"<\/span>  <span class=\"hljs-attr\">wire:model<\/span>=<span class=\"hljs-string\">\"files\"<\/span>  <span class=\"hljs-attr\">multiple<\/span>&gt;<\/span>\n\n@error('files'|'files.*')\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"invalid-feedback\"<\/span>&gt;<\/span>{{ $message }}<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n\n@enderror\n\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">small<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"text-muted text-center mt-2\"<\/span>  <span class=\"hljs-attr\">wire:loading<\/span>  <span class=\"hljs-attr\">wire:target<\/span>=<span class=\"hljs-string\">\"files\"<\/span>&gt;<\/span>\n\n{{ __('Uploading') }}\u2026\n\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">small<\/span>&gt;<\/span>\n\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"text-center\"<\/span>&gt;<\/span>\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">button<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">\"submit\"<\/span>  <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"btn btn-sm btn-primary w-25\"<\/span>&gt;<\/span>\n\n{{ __('Generate Slideshow') }}\n\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">button<\/span>&gt;<\/span>\n\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">form<\/span>&gt;<\/span><\/span>\n\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>This is our Livewire Component view, this basically will display a form with a multiple-file input and a button.<\/p>\n<p>You will see the implementation in code shortly.<\/p>\n<h2>Implementation in Code<\/h2>\n<p>Open the file <code>app\/Http\/Livewire\/MultipleFileUpload.php<\/code>. Here, we are going to add a method that will handle the multiple files selected by the user, upload them to Cloudinary and save their <code>public_id<\/code>\u2019s in an array that we will use later on.<\/p>\n<p>Add the following code to this file.<\/p>\n<ol>\n<li>First, we use Livewires <code>WithFileUploads<\/code> to help us with file uploads, then create two variables <code>$media<\/code>\n<\/li>\n<\/ol>\n<p>and <code>$optimizedImage<\/code> which is an array that will contain the image URLs we get back from Cloudinary.<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\">\n<span class=\"hljs-keyword\">use<\/span>  <span class=\"hljs-title\">Livewire<\/span>\\<span class=\"hljs-title\">WithFileUploads<\/span>;\n\n<span class=\"hljs-keyword\">public<\/span>  $files  =  &#91;];\n\n<span class=\"hljs-keyword\">public<\/span>  $slides  =  &#91;];\n\n<span class=\"hljs-comment\">\/\/ Needed to specify the type of media file for our slideshow<\/span>\n\n<span class=\"hljs-keyword\">public<\/span>  $imageExt  =  &#91;<span class=\"hljs-string\">'jpeg'<\/span>,  <span class=\"hljs-string\">'jpg'<\/span>,  <span class=\"hljs-string\">'png'<\/span>,  <span class=\"hljs-string\">'gif'<\/span>,];\n\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<ol start=\"2\">\n<li>Secondly, we will create the <code>uploadFiles<\/code> function which will upload the media files to <a href=\"https:\/\/cloudinary.com\">Cloudinary<\/a>. We will apply specific transformations that will optimize our images for our slideshow with an aspect ratio of <code>9:16<\/code> which works great for most social media platforms.<\/li>\n<\/ol>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\">\n<span class=\"hljs-keyword\">public<\/span>  <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span>  <span class=\"hljs-title\">uploadFiles<\/span><span class=\"hljs-params\">()<\/span>  <\/span>{\n\n...\n\n}\n\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<ol start=\"3\">\n<li>Let\u2019s populate our method in step 2 above:<\/li>\n<\/ol>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\">\n<span class=\"hljs-keyword\">public<\/span>  <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span>  <span class=\"hljs-title\">uploadFiles<\/span><span class=\"hljs-params\">()<\/span>  <\/span>{\n\n<span class=\"hljs-comment\">\/* First we validate the input from the user. We will take multiple image and or video files less than 10MB in size *\/<\/span>\n\n<span class=\"hljs-keyword\">$this<\/span>-&gt;validate(&#91;\n\n<span class=\"hljs-string\">'files'<\/span>  =&gt;  &#91;\n\n<span class=\"hljs-string\">'required'<\/span>,\n\n<span class=\"hljs-string\">'max:102400'<\/span>\n\n],\n\n<span class=\"hljs-string\">'files.*'<\/span>  =&gt;  <span class=\"hljs-string\">'mimes:jpeg,jpg,png,gif,avi,mp4,webm,mov,ogg,mkv,flv,m3u8,ts,3gp,wmv,3g2,m4v'<\/span>\n\n]);\n\n<span class=\"hljs-comment\">\/* We will now upload the media files to Cloudinary with specified transformations and get back the public_id *\/<\/span>\n\n<span class=\"hljs-keyword\">foreach<\/span>  (<span class=\"hljs-keyword\">$this<\/span>-&gt;files  <span class=\"hljs-keyword\">as<\/span>  $file)  {\n\n$media  =  cloudinary()-&gt;upload($file-&gt;getRealPath(),  &#91;\n\n<span class=\"hljs-string\">'folder'<\/span>  =&gt;  <span class=\"hljs-string\">'video-slideshow'<\/span>,\n\n<span class=\"hljs-string\">'public_id'<\/span>  =&gt;  $file-&gt;getClientOriginalName(),\n\n<span class=\"hljs-string\">'transformation'<\/span>  =&gt;  &#91;\n\n<span class=\"hljs-string\">'aspect_ratio'<\/span>  =&gt;  <span class=\"hljs-string\">'9:16'<\/span>,\n\n<span class=\"hljs-string\">'gravity'<\/span>  =&gt;  <span class=\"hljs-string\">'auto'<\/span>,  <span class=\"hljs-comment\">\/\/can be face, face etc<\/span>\n\n<span class=\"hljs-string\">'crop'<\/span>  =&gt;  <span class=\"hljs-string\">'fill'<\/span>\n\n]\n\n])-&gt;getPublicId();\n\n<span class=\"hljs-comment\">\/* Here we will check whether the file is an image or video from its extension and generate the appropriate media type parameter for the manifest_json *\/<\/span>\n\n<span class=\"hljs-keyword\">if<\/span>  (in_array($file-&gt;getClientOriginalExtension(),  <span class=\"hljs-keyword\">$this<\/span>-&gt;imageExt))  {\n\n<span class=\"hljs-keyword\">$this<\/span>-&gt;slides&#91;]  =  &#91;<span class=\"hljs-string\">'media'<\/span>  =&gt;  <span class=\"hljs-string\">'i:'<\/span>.$media];\n\n}  <span class=\"hljs-keyword\">else<\/span>  {\n\n<span class=\"hljs-keyword\">$this<\/span>-&gt;slides&#91;]  =  &#91;<span class=\"hljs-string\">'media'<\/span>  =&gt;  <span class=\"hljs-string\">'v:'<\/span>.$media];\n\n}\n\n}\n\n<span class=\"hljs-comment\">\/* Creating the manifest_json parameter *\/<\/span>\n\n$manifestJson  =  json_encode(&#91;\n\n<span class=\"hljs-string\">\"w\"<\/span>  =&gt;  <span class=\"hljs-number\">540<\/span>,\n\n<span class=\"hljs-string\">\"h\"<\/span>  =&gt;  <span class=\"hljs-number\">960<\/span>,\n\n<span class=\"hljs-string\">\"du\"<\/span>  =&gt;  <span class=\"hljs-number\">60<\/span>,\n\n<span class=\"hljs-string\">\"vars\"<\/span>  =&gt;  &#91;\n\n<span class=\"hljs-string\">\"sdur\"<\/span>  =&gt;  <span class=\"hljs-number\">3000<\/span>,\n\n<span class=\"hljs-string\">\"tdur\"<\/span>  =&gt;  <span class=\"hljs-number\">1500<\/span>,\n\n<span class=\"hljs-string\">\"slides\"<\/span>  =&gt;  <span class=\"hljs-keyword\">$this<\/span>-&gt;slides,\n\n],\n\n]);\n\n<span class=\"hljs-comment\">\/* signingData for generating the signature *\/<\/span>\n\n$cloudName  =  env(<span class=\"hljs-string\">'CLOUDINARY_CLOUD_NAME'<\/span>);\n\n$timestamp  =  (string)  Carbon::now()-&gt;unix();\n\n$signingData  =  &#91;\n\n<span class=\"hljs-string\">'timestamp'<\/span>  =&gt;  $timestamp,\n\n<span class=\"hljs-string\">'manifest_json'<\/span>  =&gt;  $manifestJson,\n\n<span class=\"hljs-string\">'public_id'<\/span>  =&gt;  <span class=\"hljs-string\">'test_slideshow'<\/span>,\n\n<span class=\"hljs-string\">'folder'<\/span>  =&gt;  <span class=\"hljs-string\">'video-slideshow'<\/span>,\n\n<span class=\"hljs-string\">'notification_url'<\/span>  =&gt;  env(<span class=\"hljs-string\">'CLOUDINARY_NOTIFICATION_URL'<\/span>)\n\n];\n\n$signature  =  ApiUtils::signParameters($signingData,  env(<span class=\"hljs-string\">'CLOUDINARY_API_SECRET'<\/span>));\n\n<span class=\"hljs-comment\">\/* Using Laravel Http Request to send a POST request to the create_slideshow end point *\/<\/span>\n\n$response  =  Http::post(<span class=\"hljs-string\">\"https:\/\/api.cloudinary.com\/v1_1\/$cloudName\/video\/create_slideshow\"<\/span>,  &#91;\n\n<span class=\"hljs-string\">'api_key'<\/span>  =&gt;  env(<span class=\"hljs-string\">'CLOUDINARY_API_KEY'<\/span>),\n\n<span class=\"hljs-string\">'signature'<\/span>  =&gt;  $signature,\n\n<span class=\"hljs-string\">'timestamp'<\/span>  =&gt;  $timestamp,\n\n<span class=\"hljs-string\">'manifest_json'<\/span>  =&gt;  $manifestJson,\n\n<span class=\"hljs-string\">'resource_type'<\/span>  =&gt;  <span class=\"hljs-string\">'video'<\/span>,\n\n<span class=\"hljs-string\">'public_id'<\/span>  =&gt;  <span class=\"hljs-string\">'test_slideshow'<\/span>,\n\n<span class=\"hljs-string\">'folder'<\/span>  =&gt;  <span class=\"hljs-string\">'video-slideshow'<\/span>,\n\n<span class=\"hljs-string\">'notification_url'<\/span>  =&gt;  env(<span class=\"hljs-string\">'CLOUDINARY_NOTIFICATION_URL'<\/span>)\n\n]);\n\n<span class=\"hljs-comment\">\/\/ Determine if the status code is &gt;= 200 and &lt; 300...<\/span>\n\n<span class=\"hljs-keyword\">if<\/span>  ($response-&gt;successful())  {\n\nsession()-&gt;flash(<span class=\"hljs-string\">'message'<\/span>,  <span class=\"hljs-string\">'Slideshow generated successfully!'<\/span>);\n\n}  <span class=\"hljs-keyword\">else<\/span>  {\n\nsession()-&gt;flash(<span class=\"hljs-string\">'error'<\/span>,  <span class=\"hljs-string\">'Slideshow generation failed! Try again later.'<\/span>);\n\n}\n\n}\n\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>The code above uploads the media files to Cloudinary returning their <code> public_id<\/code>\u2018s. Let\u2019s talk about the code.<\/p>\n<ul>\n<li>\n<h3>Uploading the media files<\/h3>\n<\/li>\n<\/ul>\n<p>We will get the files from user input and upload them to Cloudinary and use their <code>public_id<\/code>\u2019s to create the media type parameter <code>media_<\/code> which will take the form <code>media_i:&lt;public_id&gt;<\/code> for images and <code>media_v:&lt;public_id&gt;<\/code> for videos.<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\">\n<span class=\"hljs-keyword\">foreach<\/span>  (<span class=\"hljs-keyword\">$this<\/span>-&gt;files  <span class=\"hljs-keyword\">as<\/span>  $file)  {\n\n$media  =  cloudinary()-&gt;upload($file-&gt;getRealPath(),  &#91;\n\n<span class=\"hljs-string\">'folder'<\/span>  =&gt;  <span class=\"hljs-string\">'video-slideshow'<\/span>,\n\n<span class=\"hljs-string\">'public_id'<\/span>  =&gt;  $file-&gt;getClientOriginalName(),\n\n<span class=\"hljs-string\">'transformation'<\/span>  =&gt;  &#91;\n\n<span class=\"hljs-string\">'aspect_ratio'<\/span>  =&gt;  <span class=\"hljs-string\">'9:16'<\/span>,\n\n<span class=\"hljs-string\">'gravity'<\/span>  =&gt;  <span class=\"hljs-string\">'auto'<\/span>,  <span class=\"hljs-comment\">\/\/can be face, face etc<\/span>\n\n<span class=\"hljs-string\">'crop'<\/span>  =&gt;  <span class=\"hljs-string\">'fill'<\/span>\n\n]])-&gt;getPublicId();\n\n  \n\n<span class=\"hljs-keyword\">if<\/span>  (in_array($file-&gt;getClientOriginalExtension(),  <span class=\"hljs-keyword\">$this<\/span>-&gt;imageExt))  {\n\n<span class=\"hljs-keyword\">$this<\/span>-&gt;slides&#91;]  =  &#91;<span class=\"hljs-string\">'media'<\/span>  =&gt;  <span class=\"hljs-string\">'i:'<\/span>.$media];\n\n}  <span class=\"hljs-keyword\">else<\/span>  {\n\n<span class=\"hljs-keyword\">$this<\/span>-&gt;slides&#91;]  =  &#91;<span class=\"hljs-string\">'media'<\/span>  =&gt;  <span class=\"hljs-string\">'v:'<\/span>.$media];\n\n}\n\n}\n\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<ul>\n<li>\n<h3>The <code>manifest_json<\/code> parameter<\/h3>\n<\/li>\n<\/ul>\n<p>The create a slideshow endpoint requires either a <code>manifest_transformation<\/code> or a <code>manifest_json<\/code>. The <code>manifest_json<\/code> parameter is a stringified json parameter, allowing you to define your slideshow settings in a structured data format, which then needs to be converted to a string.<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\">\n$manifestJson  =  json_encode(&#91;\n\n<span class=\"hljs-string\">\"w\"<\/span>  =&gt;  <span class=\"hljs-number\">540<\/span>,\n\n<span class=\"hljs-string\">\"h\"<\/span>  =&gt;  <span class=\"hljs-number\">960<\/span>,\n\n<span class=\"hljs-string\">\"du\"<\/span>  =&gt;  <span class=\"hljs-number\">60<\/span>,\n\n<span class=\"hljs-string\">\"vars\"<\/span>  =&gt;  &#91;\n\n<span class=\"hljs-string\">\"sdur\"<\/span>  =&gt;  <span class=\"hljs-number\">3000<\/span>,\n\n<span class=\"hljs-string\">\"tdur\"<\/span>  =&gt;  <span class=\"hljs-number\">1500<\/span>,\n\n<span class=\"hljs-string\">\"slides\"<\/span>  =&gt;  <span class=\"hljs-keyword\">$this<\/span>-&gt;slides,\n\n],\n\n]);\n\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>You can checkout the <a href=\"https:\/\/cloudinary.com\/documentation\/video_slideshow_generation#reference\">reference<\/a> for full details on the relevant options.<\/p>\n<ul>\n<li>\n<h3>Generating a signature<\/h3>\n<\/li>\n<\/ul>\n<p>Since we are sending a request to the Cloudinary API, we need to create a signature to authenticate our request. Cloudinary SDKs automatically generate this signature for any upload or admin method that requires it. However, in this case, we are making a direct call to the REST API and we need to generate the signature.<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\">\n$cloudName  =  env(<span class=\"hljs-string\">'CLOUDINARY_CLOUD_NAME'<\/span>);\n\n$timestamp  =  (string)  Carbon::now()-&gt;unix();\n\n$signingData  =  &#91;\n\n<span class=\"hljs-string\">'timestamp'<\/span>  =&gt;  $timestamp,\n\n<span class=\"hljs-string\">'manifest_json'<\/span>  =&gt;  $manifestJson,\n\n<span class=\"hljs-string\">'public_id'<\/span>  =&gt;  <span class=\"hljs-string\">'test_slideshow'<\/span>,\n\n<span class=\"hljs-string\">'folder'<\/span>  =&gt;  <span class=\"hljs-string\">'video-slideshow'<\/span>,\n\n<span class=\"hljs-string\">'notification_url'<\/span>  =&gt;  env(<span class=\"hljs-string\">'CLOUDINARY_NOTIFICATION_URL'<\/span>)\n\n];\n\n  \n\n$signature  =  ApiUtils::signParameters($signingData,  env(<span class=\"hljs-string\">'CLOUDINARY_API_SECRET'<\/span>));\n\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>The signature is a SHA-1 or SHA-256 hexadecimal message digest created based on the following parameters:<\/p>\n<ul>\n<li>\n<p>All parameters added to the method call should be included <strong>except<\/strong> : <code>file<\/code>, <code>cloud_name<\/code>, <code>resource_type<\/code> and your <code>api_key<\/code>.<\/p>\n<\/li>\n<li>\n<p>Add the <code>timestamp<\/code> parameter.<\/p>\n<\/li>\n<li>\n<p>Sort all the parameters in alphabetical order.<\/p>\n<\/li>\n<li>\n<p>Separate the parameter names from their values with an <code>=<\/code> and join the parameter\/value pairs together with an <code>&amp;<\/code>.<\/p>\n<\/li>\n<\/ul>\n<p><em><strong>Tip:<\/strong><\/em> We took a shortcut and used the Cloudinary SDK <code>ApiUtils<\/code> to create the signature:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\">\n$signature  =  ApiUtils::signParameters($signingData,  env(<span class=\"hljs-string\">'CLOUDINARY_API_SECRET'<\/span>));\n\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<ul>\n<li>\n<h3>Sending the <code>POST<\/code> request to Cloudinary<\/h3>\n<\/li>\n<\/ul>\n<p>With  everything  ready  we  can  send  the  request  to  Cloudinary  and  start  the  video  slideshow  generation.  We  will  use  Laravel\u2019s  Http  Request  based  on  Guzzle.<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\">\n$response = Http::post(<span class=\"hljs-string\">\"https:\/\/api.cloudinary.com\/v1_1\/$cloudName\/video\/create_slideshow\"<\/span>, &#91;\n\n<span class=\"hljs-string\">'api_key'<\/span> =&gt; env(<span class=\"hljs-string\">'CLOUDINARY_API_KEY'<\/span>),\n\n<span class=\"hljs-string\">'signature'<\/span> =&gt; $signature,\n\n<span class=\"hljs-string\">'timestamp'<\/span> =&gt; $timestamp,\n\n<span class=\"hljs-string\">'manifest_json'<\/span> =&gt; $manifestJson,\n\n<span class=\"hljs-string\">'resource_type'<\/span> =&gt; <span class=\"hljs-string\">'video'<\/span>,\n\n<span class=\"hljs-string\">'public_id'<\/span> =&gt; <span class=\"hljs-string\">'test_slideshow'<\/span>,\n\n<span class=\"hljs-string\">'folder'<\/span> =&gt; <span class=\"hljs-string\">'video-slideshow'<\/span>,\n\n<span class=\"hljs-string\">'notification_url'<\/span> =&gt; env(<span class=\"hljs-string\">'CLOUDINARY_NOTIFICATION_URL'<\/span>)\n\n]);\n\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p><strong>Note:<\/strong> Once our slideshow is ready Cloudinary will send us a Webhook notification to the <code>notification_url<\/code>.<\/p>\n<p>If you successfully implemented the code above, you should be able to see the following when you navigate to <code>http:\/\/localhost:8000<\/code>:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/dgrpkngjn\/image\/upload\/c_limit,w_2000\/f_auto\/q_auto\/v1656670841\/video-slideshow\/assets\/cloudinary-video-slideshow_ggzziv.png\" alt=\"Cloudinary Video Slideshow\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"1350\" height=\"795\"\/><\/p>\n<h2>Handling the Webhook Notification<\/h2>\n<p>Once we send the request successfully. Cloudinary will send us a <code>pending<\/code> response as it processes the generation of the video slideshow:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/dgrpkngjn\/image\/upload\/c_limit,w_2000\/f_auto\/q_auto\/v1656673744\/video-slideshow\/assets\/cloudinary-video-slideshow-successful-request_hiktz2.png\" alt=\"Cloudinary Video Slideshow Success\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"1350\" height=\"934\"\/><\/p>\n<p>Cloudinary will send the following response:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json shcb-wrap-lines\">\n{\n\n<span class=\"hljs-attr\">\"status\"<\/span>:  <span class=\"hljs-string\">\"processing\"<\/span>,\n\n<span class=\"hljs-attr\">\"public_id\"<\/span>:  <span class=\"hljs-string\">\"test_slideshow\"<\/span>,\n\n<span class=\"hljs-attr\">\"batch_id\"<\/span>:  <span class=\"hljs-string\">\"00b45635e533ab11e63585dd145ab7816ca19bff2bf3f298a0e66d87405ab7793\"<\/span>\n\n}\n\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON with Comments<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>When the Cloudinary is done generating the slideshow it will send us a Webhook notification to the notification URL we provided in the request.<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json shcb-wrap-lines\">\n{\n\n<span class=\"hljs-attr\">\"notification_type\"<\/span>:  <span class=\"hljs-string\">\"upload\"<\/span>,\n\n<span class=\"hljs-attr\">\"timestamp\"<\/span>:  <span class=\"hljs-string\">\"2021-08-11T07:44:41+00:00\"<\/span>,\n\n<span class=\"hljs-attr\">\"request_id\"<\/span>:  <span class=\"hljs-string\">\"799b0f8305df4206b6d8f5dbdde0cdfc\"<\/span>,\n\n<span class=\"hljs-attr\">\"asset_id\"<\/span>:  <span class=\"hljs-string\">\"640cb419bed70ef5b86e2bbe7cbb388a\"<\/span>,\n\n<span class=\"hljs-attr\">\"public_id\"<\/span>:  <span class=\"hljs-string\">\"test_slideshow\"<\/span>,\n\n<span class=\"hljs-attr\">\"version\"<\/span>:  <span class=\"hljs-number\">1628667799<\/span>,\n\n<span class=\"hljs-attr\">\"version_id\"<\/span>:  <span class=\"hljs-string\">\"afcd9bdec6552adc43d7f316da077200\"<\/span>,\n\n<span class=\"hljs-attr\">\"width\"<\/span>:  <span class=\"hljs-number\">500<\/span>,\n\n<span class=\"hljs-attr\">\"height\"<\/span>:  <span class=\"hljs-number\">500<\/span>,\n\n<span class=\"hljs-attr\">\"format\"<\/span>:  <span class=\"hljs-string\">\"mp4\"<\/span>,\n\n<span class=\"hljs-attr\">\"resource_type\"<\/span>:  <span class=\"hljs-string\">\"video\"<\/span>,\n\n<span class=\"hljs-attr\">\"created_at\"<\/span>:  <span class=\"hljs-string\">\"2021-08-11T07:43:19Z\"<\/span>,\n\n<span class=\"hljs-attr\">\"tags\"<\/span>:  &#91;],\n\n<span class=\"hljs-attr\">\"pages\"<\/span>:  <span class=\"hljs-number\">0<\/span>,\n\n<span class=\"hljs-attr\">\"bytes\"<\/span>:  <span class=\"hljs-number\">521868<\/span>,\n\n<span class=\"hljs-attr\">\"type\"<\/span>:  <span class=\"hljs-string\">\"upload\"<\/span>,\n\n<span class=\"hljs-attr\">\"etag\"<\/span>:  <span class=\"hljs-string\">\"d7b3ecf1f5508af9fb8518158e78642f\"<\/span>,\n\n<span class=\"hljs-attr\">\"placeholder\"<\/span>:  <span class=\"hljs-literal\">false<\/span>,\n\n<span class=\"hljs-attr\">\"url\"<\/span>:  <span class=\"hljs-string\">\"http:\/\/res.cloudinary.com\/demo\/video\/upload\/v1628667799\/test_slideshow.mp4\"<\/span>,\n\n<span class=\"hljs-attr\">\"secure_url\"<\/span>:  <span class=\"hljs-string\">\"https:\/\/res.cloudinary.com\/demo\/video\/upload\/v1628667799\/test_slideshow.mp4\"<\/span>,\n\n<span class=\"hljs-attr\">\"access_mode\"<\/span>:  <span class=\"hljs-string\">\"public\"<\/span>,\n\n<span class=\"hljs-attr\">\"audio\"<\/span>:  {},\n\n<span class=\"hljs-attr\">\"video\"<\/span>:  {\n\n<span class=\"hljs-attr\">\"pix_format\"<\/span>:  <span class=\"hljs-string\">\"yuv420p\"<\/span>,\n\n<span class=\"hljs-attr\">\"codec\"<\/span>:  <span class=\"hljs-string\">\"h264\"<\/span>,\n\n<span class=\"hljs-attr\">\"level\"<\/span>:  <span class=\"hljs-number\">30<\/span>,\n\n<span class=\"hljs-attr\">\"profile\"<\/span>:  <span class=\"hljs-string\">\"High\"<\/span>,\n\n<span class=\"hljs-attr\">\"bit_rate\"<\/span>:  <span class=\"hljs-string\">\"163900\"<\/span>,\n\n<span class=\"hljs-attr\">\"time_base\"<\/span>:  <span class=\"hljs-string\">\"1\/15360\"<\/span>\n\n},\n\n<span class=\"hljs-attr\">\"frame_rate\"<\/span>:  <span class=\"hljs-number\">30<\/span>,\n\n<span class=\"hljs-attr\">\"bit_rate\"<\/span>:  <span class=\"hljs-number\">166997<\/span>,\n\n<span class=\"hljs-attr\">\"duration\"<\/span>:  <span class=\"hljs-number\">25<\/span>,\n\n<span class=\"hljs-attr\">\"rotation\"<\/span>:  <span class=\"hljs-number\">0<\/span>,\n\n<span class=\"hljs-attr\">\"nb_frames\"<\/span>:  <span class=\"hljs-number\">750<\/span>\n\n}\n\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON with Comments<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>We will handle this notification by creating a <code>WebhookController.php<\/code> by typing the following command:<\/p>\n<p><code>php artisan make:controller WebhookController<\/code><\/p>\n<p>In the file created <code>app\/Http\/Controllers\/WebhookController.php<\/code> we will add the following code:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\">\n<span class=\"hljs-keyword\">public<\/span>  <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span>  <span class=\"hljs-title\">cloudinary<\/span><span class=\"hljs-params\">(Request  $request)<\/span>  <\/span>{\n\n<span class=\"hljs-comment\">\/\/Verification<\/span>\n\n$verified  =  SignatureVerifier::verifyNotificationSignature(json_encode($request),  $request-&gt;header(<span class=\"hljs-string\">'X-Cld-Timestamp'<\/span>),  $request-&gt;header(<span class=\"hljs-string\">'X-Cld-Signature'<\/span>));\n\n  \n\n<span class=\"hljs-comment\">\/\/ If the signature is verified get the secure url to our slideshow<\/span>\n\n<span class=\"hljs-keyword\">if<\/span>  ($verified)  {\n\n$secureUrl  =  $request-&gt;secure_url;\n\n  \n\n<span class=\"hljs-keyword\">return<\/span>  view(<span class=\"hljs-string\">'livewire.view-slideshow'<\/span>,  &#91;<span class=\"hljs-string\">'slideshow_url'<\/span>  =&gt;  $secureUrl]);\n\n}\n\n  \n\n<span class=\"hljs-keyword\">return<\/span>  response(<span class=\"hljs-string\">'Unverified'<\/span>,  <span class=\"hljs-number\">401<\/span>);\n\n}\n\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p><em><strong>Tip:<\/strong><\/em> A webhook is a mechanism where an application can notify another application that something has happened.<\/p>\n<p>When we receive the notification from Cloudinary we can notify the user by sending them an e-mail, SMS, or push notification. It is really up to you but, in this case, we are just returning a view and passing the slideshow URL to it.<\/p>\n<p>Since the notification from Cloudinary will be an external request we will need to allow it through the <code>VerifyCsrfToken.php<\/code> middleware to prevent CSRF errors.<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-15\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\">\n...\n\n<span class=\"hljs-keyword\">protected<\/span>  $except  =  &#91;\n\n<span class=\"hljs-string\">'webhooks'<\/span>\n\n];\n\n}\n\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-15\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>Next, we will create the webhook route in <code>routes\/api.php<\/code>.<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-16\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\">\n...\n\n<span class=\"hljs-comment\">\/\/webhooks client<\/span>\n\nRoute::post(<span class=\"hljs-string\">'webhooks\/cloudinary'<\/span>,  &#91;WebhookController::class,  <span class=\"hljs-string\">'cloudinary'<\/span>]);\n\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-16\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>And  finally  update  our  <code>CLOUDINARY_NOTIFICATION_URL<\/code>  in  the  environment  variables  file  <code>.env<\/code>  as  follows:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-17\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml shcb-wrap-lines\">\nCLOUDINARY_NOTIFICATION_URL=https:\/\/<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">example.com<\/span>&gt;<\/span>\/api\/webhooks\/cloudinary\n\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-17\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>Finally, we can enjoy our slideshow:<\/p>\n<p><a href=\"https:\/\/res.cloudinary.com\/dgrpkngjn\/video\/upload\/v1656676242\/video-slideshow\/test_slideshow.mp4\">Video Slideshow<\/a><\/p>\n<h2>Conclusion<\/h2>\n<p>Yes, Cloudinary makes it easy to generate a slideshow by automating and applying some transformations. This is beautiful since it allows you to focus on other things like promoting your business with the newly created slideshow.<\/p>\n<p>The possibilities are endless, check out Cloudinary for your A to Z media management &#8211; upload, storage, administration, manipulation, optimization, and delivery.<\/p>\n<p><a href=\"https:\/\/cloudinary.com\/signup\">Get started<\/a> with Cloudinary in your Laravel projects for FREE!<\/p>\n<\/div>","protected":false},"excerpt":{"rendered":"","protected":false},"author":41,"featured_media":27940,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_cloudinary_featured_overwrite":false,"footnotes":""},"categories":[1],"tags":[134,370,387,229,371],"class_list":["post-27939","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-guest-post","tag-image","tag-laravel","tag-php","tag-under-review"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.6 (Yoast SEO v26.9) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Video Slideshows with Cloudinary &amp; Laravel<\/title>\n<meta name=\"description\" content=\"Slideshows are the perfect addition to your media collection. They make your social media content engaging, fun, and memorable and are great for business promotional purposes. In this article, we will create a video slideshow using Laravel and Cloudinary.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/cloudinary.com\/blog\/guest_post\/video-slideshows-with-cloudinary-and-laravel\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Video Slideshows with Cloudinary &amp; Laravel\" \/>\n<meta property=\"og:description\" content=\"Slideshows are the perfect addition to your media collection. They make your social media content engaging, fun, and memorable and are great for business promotional purposes. In this article, we will create a video slideshow using Laravel and Cloudinary.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cloudinary.com\/blog\/guest_post\/video-slideshows-with-cloudinary-and-laravel\/\" \/>\n<meta property=\"og:site_name\" content=\"Cloudinary Blog\" \/>\n<meta property=\"article:published_time\" content=\"2022-07-06T09:10:18+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-03-02T16:44:31+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/v1681925841\/Web_Assets\/blog\/155f8bf179e10bfa559a1aa983facb24b1ae7cfb-1000x513-1_2794099f48\/155f8bf179e10bfa559a1aa983facb24b1ae7cfb-1000x513-1_2794099f48-png?_i=AA\" \/>\n\t<meta property=\"og:image:width\" content=\"1000\" \/>\n\t<meta property=\"og:image:height\" content=\"513\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"NewsArticle\",\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/video-slideshows-with-cloudinary-and-laravel\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/video-slideshows-with-cloudinary-and-laravel\/\"},\"author\":{\"name\":\"\",\"@id\":\"\"},\"headline\":\"Video Slideshows with Cloudinary &amp; Laravel\",\"datePublished\":\"2022-07-06T09:10:18+00:00\",\"dateModified\":\"2025-03-02T16:44:31+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/video-slideshows-with-cloudinary-and-laravel\/\"},\"wordCount\":6,\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/video-slideshows-with-cloudinary-and-laravel\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681925841\/Web_Assets\/blog\/155f8bf179e10bfa559a1aa983facb24b1ae7cfb-1000x513-1_2794099f48\/155f8bf179e10bfa559a1aa983facb24b1ae7cfb-1000x513-1_2794099f48.png?_i=AA\",\"keywords\":[\"Guest Post\",\"Image\",\"Laravel\",\"PHP\",\"Under Review\"],\"inLanguage\":\"en-US\",\"copyrightYear\":\"2022\",\"copyrightHolder\":{\"@id\":\"https:\/\/cloudinary.com\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/video-slideshows-with-cloudinary-and-laravel\/\",\"url\":\"https:\/\/cloudinary.com\/blog\/guest_post\/video-slideshows-with-cloudinary-and-laravel\/\",\"name\":\"Video Slideshows with Cloudinary &amp; Laravel\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/video-slideshows-with-cloudinary-and-laravel\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/video-slideshows-with-cloudinary-and-laravel\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681925841\/Web_Assets\/blog\/155f8bf179e10bfa559a1aa983facb24b1ae7cfb-1000x513-1_2794099f48\/155f8bf179e10bfa559a1aa983facb24b1ae7cfb-1000x513-1_2794099f48.png?_i=AA\",\"datePublished\":\"2022-07-06T09:10:18+00:00\",\"dateModified\":\"2025-03-02T16:44:31+00:00\",\"description\":\"Slideshows are the perfect addition to your media collection. They make your social media content engaging, fun, and memorable and are great for business promotional purposes. In this article, we will create a video slideshow using Laravel and Cloudinary.\",\"breadcrumb\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/video-slideshows-with-cloudinary-and-laravel\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cloudinary.com\/blog\/guest_post\/video-slideshows-with-cloudinary-and-laravel\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/video-slideshows-with-cloudinary-and-laravel\/#primaryimage\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681925841\/Web_Assets\/blog\/155f8bf179e10bfa559a1aa983facb24b1ae7cfb-1000x513-1_2794099f48\/155f8bf179e10bfa559a1aa983facb24b1ae7cfb-1000x513-1_2794099f48.png?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681925841\/Web_Assets\/blog\/155f8bf179e10bfa559a1aa983facb24b1ae7cfb-1000x513-1_2794099f48\/155f8bf179e10bfa559a1aa983facb24b1ae7cfb-1000x513-1_2794099f48.png?_i=AA\",\"width\":1000,\"height\":513},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/video-slideshows-with-cloudinary-and-laravel\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cloudinary.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Video Slideshows with Cloudinary &amp; Laravel\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\",\"url\":\"https:\/\/cloudinary.com\/blog\/\",\"name\":\"Cloudinary Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/cloudinary.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\",\"name\":\"Cloudinary Blog\",\"url\":\"https:\/\/cloudinary.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"width\":312,\"height\":60,\"caption\":\"Cloudinary Blog\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Video Slideshows with Cloudinary &amp; Laravel","description":"Slideshows are the perfect addition to your media collection. They make your social media content engaging, fun, and memorable and are great for business promotional purposes. In this article, we will create a video slideshow using Laravel and Cloudinary.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/cloudinary.com\/blog\/guest_post\/video-slideshows-with-cloudinary-and-laravel\/","og_locale":"en_US","og_type":"article","og_title":"Video Slideshows with Cloudinary &amp; Laravel","og_description":"Slideshows are the perfect addition to your media collection. They make your social media content engaging, fun, and memorable and are great for business promotional purposes. In this article, we will create a video slideshow using Laravel and Cloudinary.","og_url":"https:\/\/cloudinary.com\/blog\/guest_post\/video-slideshows-with-cloudinary-and-laravel\/","og_site_name":"Cloudinary Blog","article_published_time":"2022-07-06T09:10:18+00:00","article_modified_time":"2025-03-02T16:44:31+00:00","og_image":[{"width":1000,"height":513,"url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/v1681925841\/Web_Assets\/blog\/155f8bf179e10bfa559a1aa983facb24b1ae7cfb-1000x513-1_2794099f48\/155f8bf179e10bfa559a1aa983facb24b1ae7cfb-1000x513-1_2794099f48-png?_i=AA","type":"image\/png"}],"twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"NewsArticle","@id":"https:\/\/cloudinary.com\/blog\/guest_post\/video-slideshows-with-cloudinary-and-laravel\/#article","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/guest_post\/video-slideshows-with-cloudinary-and-laravel\/"},"author":{"name":"","@id":""},"headline":"Video Slideshows with Cloudinary &amp; Laravel","datePublished":"2022-07-06T09:10:18+00:00","dateModified":"2025-03-02T16:44:31+00:00","mainEntityOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/guest_post\/video-slideshows-with-cloudinary-and-laravel\/"},"wordCount":6,"publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/guest_post\/video-slideshows-with-cloudinary-and-laravel\/#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681925841\/Web_Assets\/blog\/155f8bf179e10bfa559a1aa983facb24b1ae7cfb-1000x513-1_2794099f48\/155f8bf179e10bfa559a1aa983facb24b1ae7cfb-1000x513-1_2794099f48.png?_i=AA","keywords":["Guest Post","Image","Laravel","PHP","Under Review"],"inLanguage":"en-US","copyrightYear":"2022","copyrightHolder":{"@id":"https:\/\/cloudinary.com\/#organization"}},{"@type":"WebPage","@id":"https:\/\/cloudinary.com\/blog\/guest_post\/video-slideshows-with-cloudinary-and-laravel\/","url":"https:\/\/cloudinary.com\/blog\/guest_post\/video-slideshows-with-cloudinary-and-laravel\/","name":"Video Slideshows with Cloudinary &amp; Laravel","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/guest_post\/video-slideshows-with-cloudinary-and-laravel\/#primaryimage"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/guest_post\/video-slideshows-with-cloudinary-and-laravel\/#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681925841\/Web_Assets\/blog\/155f8bf179e10bfa559a1aa983facb24b1ae7cfb-1000x513-1_2794099f48\/155f8bf179e10bfa559a1aa983facb24b1ae7cfb-1000x513-1_2794099f48.png?_i=AA","datePublished":"2022-07-06T09:10:18+00:00","dateModified":"2025-03-02T16:44:31+00:00","description":"Slideshows are the perfect addition to your media collection. They make your social media content engaging, fun, and memorable and are great for business promotional purposes. In this article, we will create a video slideshow using Laravel and Cloudinary.","breadcrumb":{"@id":"https:\/\/cloudinary.com\/blog\/guest_post\/video-slideshows-with-cloudinary-and-laravel\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cloudinary.com\/blog\/guest_post\/video-slideshows-with-cloudinary-and-laravel\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/guest_post\/video-slideshows-with-cloudinary-and-laravel\/#primaryimage","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681925841\/Web_Assets\/blog\/155f8bf179e10bfa559a1aa983facb24b1ae7cfb-1000x513-1_2794099f48\/155f8bf179e10bfa559a1aa983facb24b1ae7cfb-1000x513-1_2794099f48.png?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681925841\/Web_Assets\/blog\/155f8bf179e10bfa559a1aa983facb24b1ae7cfb-1000x513-1_2794099f48\/155f8bf179e10bfa559a1aa983facb24b1ae7cfb-1000x513-1_2794099f48.png?_i=AA","width":1000,"height":513},{"@type":"BreadcrumbList","@id":"https:\/\/cloudinary.com\/blog\/guest_post\/video-slideshows-with-cloudinary-and-laravel\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cloudinary.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Video Slideshows with Cloudinary &amp; Laravel"}]},{"@type":"WebSite","@id":"https:\/\/cloudinary.com\/blog\/#website","url":"https:\/\/cloudinary.com\/blog\/","name":"Cloudinary Blog","description":"","publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/cloudinary.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/cloudinary.com\/blog\/#organization","name":"Cloudinary Blog","url":"https:\/\/cloudinary.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","width":312,"height":60,"caption":"Cloudinary Blog"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":""}]}},"jetpack_featured_media_url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681925841\/Web_Assets\/blog\/155f8bf179e10bfa559a1aa983facb24b1ae7cfb-1000x513-1_2794099f48\/155f8bf179e10bfa559a1aa983facb24b1ae7cfb-1000x513-1_2794099f48.png?_i=AA","_links":{"self":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/27939","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/users\/41"}],"replies":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/comments?post=27939"}],"version-history":[{"count":1,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/27939\/revisions"}],"predecessor-version":[{"id":37073,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/27939\/revisions\/37073"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media\/27940"}],"wp:attachment":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media?parent=27939"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/categories?post=27939"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/tags?post=27939"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}