{"id":27831,"date":"2022-07-05T06:38:59","date_gmt":"2022-07-05T06:38:59","guid":{"rendered":"http:\/\/video-moderation-with-cloudinary"},"modified":"2022-07-05T06:38:59","modified_gmt":"2022-07-05T06:38:59","slug":"video-moderation-with-cloudinary","status":"publish","type":"post","link":"https:\/\/cloudinary.com\/blog\/guest_post\/video-moderation-with-cloudinary\/","title":{"rendered":"Video Moderation with Cloudinary"},"content":{"rendered":"<div class=\"wp-block-cloudinary-markdown \"><h2>Introduction<\/h2>\n<p>Video moderation helps you share highly engaging and effective video content while protecting your brand, customers and profits. We will create a simple automated video moderation platform that will help us filter out offensive videos.<\/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\/xeu5u?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\/cloudinary-video-moderation\">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, you need to have a good command of your terminal, Git and entry knowledge of PHP specifically with the Laravel 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 start 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><code>composer global require laravel\/installer<\/code><\/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, 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 API Secret.<\/li>\n<\/ol>\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>Google AI Video Moderation Addon &#8211; while at the Cloudinary dashboard, click on the Addons menu and subscribe for the Google AI Video Moderation Addon.<\/li>\n<\/ol>\n<p><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/dgrpkngjn\/image\/upload\/c_limit,w_2000\/f_auto\/q_auto\/v1656844100\/video-mod\/assets\/cloudinary_addons_z9ovwn.png\" alt=\"Cloudinary Addons\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"940\" height=\"459\"\/><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/dgrpkngjn\/image\/upload\/c_limit,w_2000\/f_auto\/q_auto\/v1656844100\/video-mod\/assets\/cloudinary_ai_subscription_eqaqkd.png\" alt=\"Cloudinary Google AI Video Moderation Subscription\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"940\" height=\"468\"\/><\/p>\n<ol start=\"3\">\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>Cloudinary Video Moderation<\/h2>\n<p>Cloudinary employs two addons for video moderation:<\/p>\n<ol>\n<li>\n<p>Rekognition AI Video Moderaion by AWS<\/p>\n<\/li>\n<li>\n<p>Google AI Video Moderation<\/p>\n<\/li>\n<\/ol>\n<p>Google assigns a moderation confidence level indicating the chances that a video contains unacceptable content. The likelihood is given as a value on the following scale: <code>very_unlikely<\/code>, <code>unlikely<\/code>, <code>possible<\/code>, <code>likely<\/code>, and <code>very_likely<\/code>.<\/p>\n<p>To send a request for Google AI Video Moderation with the default rejection confidence level we need to set the <code>moderation<\/code> parameter to <code>google_video_moderation<\/code> and set the <code>resource_type<\/code> to <code>video<\/code>:<\/p>\n<p><code>$cloudinary-&gt;uploadApi()-&gt;upload(&quot;my_file.mp4&quot;, [ &quot;resource_type&quot; =&gt; &quot;video&quot;, &quot;moderation&quot; =&gt; &quot;google_video_moderation&quot;]);<\/code><\/p>\n<p>Let\u2019s see this in code.<\/p>\n<h2>File Upload with Livewire<\/h2>\n<p>To uplaod a video for moderation 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 FileUpload<\/code><\/p>\n<p>This will create two files, first <code>app\/Http\/Livewire\/FileUpload.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:file-upload\/&gt;<\/code><\/p>\n<p>or<\/p>\n<p><code>@livewire('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('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\">\"uploadVideo\"<\/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\">id<\/span>=<span class=\"hljs-string\">\"video\"<\/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('video') is-invalid @enderror\"<\/span>  <span class=\"hljs-attr\">wire:model<\/span>=<span class=\"hljs-string\">\"video\"<\/span>&gt;<\/span>\n\n@error('video')\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\">\"video\"<\/span>&gt;<\/span>\n\n{{ __('Uploading') }}<span class=\"hljs-symbol\">&amp;hellip;<\/span>\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\"<\/span>&gt;<\/span>\n\n{{ __('Upload Video') }}\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">i<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"spinner-border spinner-border-sm ml-1 mt-1\"<\/span>  <span class=\"hljs-attr\">wire:loading<\/span>  <span class=\"hljs-attr\">wire:target<\/span>=<span class=\"hljs-string\">\"uploadVideo\"<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">i<\/span>&gt;<\/span>\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 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\/FileUpload.php<\/code>. Here, we are going to add a method that will handle the video selected by the user, upload them to Cloudinary for video moderation.<\/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 the variable <code>$video<\/code>.<\/li>\n<\/ol>\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>  $video;\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>uploadVideo<\/code> function which will upload the video to <a href=\"https:\/\/cloudinary.com\">Cloudinary<\/a>. We will add the <code>folder<\/code>, <code>resource_type<\/code>, <code>notification_url<\/code> and <code>moderation<\/code> which will moderate the video.<\/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\">uploadVideo<\/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 a video file less than 10MB in size *\/<\/span>\n\n<span class=\"hljs-keyword\">$this<\/span>-&gt;validate(&#91;\n\n<span class=\"hljs-string\">'video'<\/span>  =&gt;  &#91;\n\n<span class=\"hljs-string\">'required'<\/span>,\n\n<span class=\"hljs-string\">'file'<\/span>,\n\n<span class=\"hljs-string\">'mimes:avi,mp4,webm,mov,ogg,mkv,flv,m3u8,ts,3gp,wmv,3g2,m4v'<\/span>,\n\n<span class=\"hljs-string\">'max:102400'<\/span>\n\n],\n\n]);\n\n<span class=\"hljs-comment\">\/* Upload video to Cloudinary for moderation *\/<\/span>\n\ncloudinary()-&gt;upload(<span class=\"hljs-keyword\">$this<\/span>-&gt;video-&gt;getRealPath(),  &#91;\n\n<span class=\"hljs-string\">'folder'<\/span>  =&gt;  <span class=\"hljs-string\">'video-mod'<\/span>,\n\n<span class=\"hljs-string\">'resource_type'<\/span>  =&gt;  <span class=\"hljs-string\">'video'<\/span>,\n\n<span class=\"hljs-string\">'moderation'<\/span>  =&gt;  <span class=\"hljs-string\">'google_video_moderation:possible'<\/span>,\n\n<span class=\"hljs-string\">'notification_url'<\/span>  =&gt;  env(<span class=\"hljs-string\">'CLOUDINARY_NOTIFICATION_URL'<\/span>)\n\n]);\n\nsession()-&gt;flash(<span class=\"hljs-string\">'message'<\/span>,  <span class=\"hljs-string\">\"Video moderation initiated successfully!\"<\/span>);\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 performs validation then uploads the video file to Cloudinary for moderation.<\/p>\n<p>On successful implementation, 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\/v1656844100\/video-mod\/assets\/cloudinary_video_mod_c4akje.png\" alt=\"Cloudinary Video Moderation\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"1338\" height=\"647\"\/><\/p>\n<p>When you successfully upload a video with questionable content you will receive two responses at the <code>notification_url<\/code> we have set.<\/p>\n<p>First response will be the upload notification with a <code>pending<\/code> moderation status:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\">\n{\n\n<span class=\"hljs-string\">\"notification_type\"<\/span>:  <span class=\"hljs-string\">\"upload\"<\/span>,\n\n<span class=\"hljs-string\">\"timestamp\"<\/span>:  <span class=\"hljs-string\">\"2022-07-03T08:50:25+00:00\"<\/span>,\n\n<span class=\"hljs-string\">\"request_id\"<\/span>:  <span class=\"hljs-string\">\"200c27d8d22acf7445ea1c759775bdb1\"<\/span>,\n\n<span class=\"hljs-string\">\"asset_id\"<\/span>:  <span class=\"hljs-string\">\"62a5e294973044fd95df8eb1887a4db3\"<\/span>,\n\n<span class=\"hljs-string\">\"public_id\"<\/span>:  <span class=\"hljs-string\">\"video-mod\/PjtS3MQJUKYZzQ88GJoJMwhEkue2ND-meta5oqW6Z_zLeiusOW9lee_juWlveeUn_a0uy5tcDQ_-_crj35i\"<\/span>,\n\n<span class=\"hljs-string\">\"version\"<\/span>:  <span class=\"hljs-number\">1656838225<\/span>,\n\n<span class=\"hljs-string\">\"version_id\"<\/span>:  <span class=\"hljs-string\">\"fefb04a8f3cd95100600cd3d8e3bdebe\"<\/span>,\n\n<span class=\"hljs-string\">\"width\"<\/span>:  <span class=\"hljs-number\">1280<\/span>,\n\n<span class=\"hljs-string\">\"height\"<\/span>:  <span class=\"hljs-number\">720<\/span>,\n\n<span class=\"hljs-string\">\"format\"<\/span>:  <span class=\"hljs-string\">\"mp4\"<\/span>,\n\n<span class=\"hljs-string\">\"resource_type\"<\/span>:  <span class=\"hljs-string\">\"video\"<\/span>,\n\n<span class=\"hljs-string\">\"moderation\"<\/span>:  &#91;\n\n{\n\n<span class=\"hljs-string\">\"status\"<\/span>:  <span class=\"hljs-string\">\"pending\"<\/span>,\n\n<span class=\"hljs-string\">\"kind\"<\/span>:  <span class=\"hljs-string\">\"google_video_moderation\"<\/span>\n\n}\n\n],\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\">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>The second response will be the moderation notification. This contains a bunch of data. Take note of the <code>moderation_status<\/code> which will let you know whether the video passed the moderation or not.<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\">\n{\n\n<span class=\"hljs-string\">\"moderation_response\"<\/span>:  {\n\n<span class=\"hljs-string\">\"moderation_confidence\"<\/span>:  <span class=\"hljs-string\">\"POSSIBLE\"<\/span>,\n\n<span class=\"hljs-string\">\"frames\"<\/span>:  &#91;\n\n{\n\n<span class=\"hljs-string\">\"pornography_likelihood\"<\/span>:  <span class=\"hljs-string\">\"POSSIBLE\"<\/span>,\n\n<span class=\"hljs-string\">\"time_offset\"<\/span>:  <span class=\"hljs-number\">0.769962<\/span>\n\n},\n\n{\n\n<span class=\"hljs-string\">\"pornography_likelihood\"<\/span>:  <span class=\"hljs-string\">\"POSSIBLE\"<\/span>,\n\n<span class=\"hljs-string\">\"time_offset\"<\/span>:  <span class=\"hljs-number\">1.891071<\/span>\n\n},\n\n{\n\n<span class=\"hljs-string\">\"pornography_likelihood\"<\/span>:  <span class=\"hljs-string\">\"POSSIBLE\"<\/span>,\n\n<span class=\"hljs-string\">\"time_offset\"<\/span>:  <span class=\"hljs-number\">2.730552<\/span>\n\n},\n\n{\n\n<span class=\"hljs-string\">\"pornography_likelihood\"<\/span>:  <span class=\"hljs-string\">\"LIKELY\"<\/span>,\n\n<span class=\"hljs-string\">\"time_offset\"<\/span>:  <span class=\"hljs-number\">3.888789<\/span>\n\n},\n\n{\n\n<span class=\"hljs-string\">\"pornography_likelihood\"<\/span>:  <span class=\"hljs-string\">\"LIKELY\"<\/span>,\n\n<span class=\"hljs-string\">\"time_offset\"<\/span>:  <span class=\"hljs-number\">4.755875<\/span>\n\n},\n\n{\n\n<span class=\"hljs-string\">\"pornography_likelihood\"<\/span>:  <span class=\"hljs-string\">\"VERY_LIKELY\"<\/span>,\n\n<span class=\"hljs-string\">\"time_offset\"<\/span>:  <span class=\"hljs-number\">5.77656<\/span>\n\n},\n\n{\n\n<span class=\"hljs-string\">\"pornography_likelihood\"<\/span>:  <span class=\"hljs-string\">\"LIKELY\"<\/span>,\n\n<span class=\"hljs-string\">\"time_offset\"<\/span>:  <span class=\"hljs-number\">6.650433<\/span>\n\n},\n\n{\n\n<span class=\"hljs-string\">\"pornography_likelihood\"<\/span>:  <span class=\"hljs-string\">\"VERY_LIKELY\"<\/span>,\n\n<span class=\"hljs-string\">\"time_offset\"<\/span>:  <span class=\"hljs-number\">7.55418<\/span>\n\n},\n\n{\n\n<span class=\"hljs-string\">\"pornography_likelihood\"<\/span>:  <span class=\"hljs-string\">\"LIKELY\"<\/span>,\n\n<span class=\"hljs-string\">\"time_offset\"<\/span>:  <span class=\"hljs-number\">8.730771<\/span>\n\n}\n\n]\n\n},\n\n<span class=\"hljs-string\">\"moderation_status\"<\/span>:  <span class=\"hljs-string\">\"rejected\"<\/span>,\n\n<span class=\"hljs-string\">\"moderation_kind\"<\/span>:  <span class=\"hljs-string\">\"google_video_moderation\"<\/span>,\n\n<span class=\"hljs-string\">\"notification_type\"<\/span>:  <span class=\"hljs-string\">\"moderation\"<\/span>,\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\">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>You can checkout the <a href=\"https:\/\/cloudinary.com\/documentation\/google_ai_video_moderation_addon\">documentation<\/a> for more details.<\/p>\n<h2>Handling Cloudinary Responses<\/h2>\n<p>Webhooks are one of a few ways web applications can communicate with each other. We can receive Cloudinary\u2019s responses through a webhook and run processes that will do something like notify the user or ban the video.<\/p>\n<p>Create 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-9\" 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 and moderation is rejected<\/span>\n\n<span class=\"hljs-keyword\">if<\/span>  ($verified  &amp;&amp;  $request-&gt;moderation_status  ===  <span class=\"hljs-string\">'rejected'<\/span>)  {\n\n<span class=\"hljs-comment\">\/\/ Ban video<\/span>\n\n...\n\n<span class=\"hljs-comment\">\/\/ Notify user<\/span>\n\n...\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-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><em><strong>Tip:<\/strong><\/em> A webhook is a mechanism where an application can notify another application that something has happened.<\/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-10\" 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-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<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-11\" 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-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>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-12\" 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\">app_url<\/span>&gt;<\/span>\/api\/webhooks\/cloudinary\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\">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<h2>Conclusion<\/h2>\n<p>Cloudinary allows you to automatically moderate all videos uploaded to your application using Google\u2019s AI Moderation. This is vital in protecting your users from explicit and suggestive adult content in videos on your website or mobile application.<\/p>\n<p>Using Cloudinary\u2019s upload and delivery APIs we can have peace of mind knowing that videos uploaded on our platforms will be automatically approved for user viewing.<\/p>\n<p>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":27832,"comment_status":"","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_cloudinary_featured_overwrite":false,"footnotes":""},"categories":[1],"tags":[134,387,229,371,303],"class_list":["post-27831","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-guest-post","tag-laravel","tag-php","tag-under-review","tag-video"],"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 Moderation with Cloudinary<\/title>\n<meta name=\"description\" content=\"Video moderation helps you share highly engaging and effective video content while protecting your brand, customers, and profits. We will create a simple automated video moderation platform that will help us filter out offensive videos.\" \/>\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-moderation-with-cloudinary\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Video Moderation with Cloudinary\" \/>\n<meta property=\"og:description\" content=\"Video moderation helps you share highly engaging and effective video content while protecting your brand, customers, and profits. We will create a simple automated video moderation platform that will help us filter out offensive videos.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cloudinary.com\/blog\/guest_post\/video-moderation-with-cloudinary\/\" \/>\n<meta property=\"og:site_name\" content=\"Cloudinary Blog\" \/>\n<meta property=\"article:published_time\" content=\"2022-07-05T06:38:59+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681926152\/Web_Assets\/blog\/1f085dc55f519def5378b47faf509ea5c5db6593-225x225-1_278326e12d\/1f085dc55f519def5378b47faf509ea5c5db6593-225x225-1_278326e12d.png?_i=AA\" \/>\n\t<meta property=\"og:image:width\" content=\"225\" \/>\n\t<meta property=\"og:image:height\" content=\"225\" \/>\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-moderation-with-cloudinary\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/video-moderation-with-cloudinary\/\"},\"author\":{\"name\":\"\",\"@id\":\"\"},\"headline\":\"Video Moderation with Cloudinary\",\"datePublished\":\"2022-07-05T06:38:59+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/video-moderation-with-cloudinary\/\"},\"wordCount\":4,\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/video-moderation-with-cloudinary\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681926152\/Web_Assets\/blog\/1f085dc55f519def5378b47faf509ea5c5db6593-225x225-1_278326e12d\/1f085dc55f519def5378b47faf509ea5c5db6593-225x225-1_278326e12d.png?_i=AA\",\"keywords\":[\"Guest Post\",\"Laravel\",\"PHP\",\"Under Review\",\"Video\"],\"inLanguage\":\"en-US\",\"copyrightYear\":\"2022\",\"copyrightHolder\":{\"@id\":\"https:\/\/cloudinary.com\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/video-moderation-with-cloudinary\/\",\"url\":\"https:\/\/cloudinary.com\/blog\/guest_post\/video-moderation-with-cloudinary\/\",\"name\":\"Video Moderation with Cloudinary\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/video-moderation-with-cloudinary\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/video-moderation-with-cloudinary\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681926152\/Web_Assets\/blog\/1f085dc55f519def5378b47faf509ea5c5db6593-225x225-1_278326e12d\/1f085dc55f519def5378b47faf509ea5c5db6593-225x225-1_278326e12d.png?_i=AA\",\"datePublished\":\"2022-07-05T06:38:59+00:00\",\"description\":\"Video moderation helps you share highly engaging and effective video content while protecting your brand, customers, and profits. We will create a simple automated video moderation platform that will help us filter out offensive videos.\",\"breadcrumb\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/video-moderation-with-cloudinary\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cloudinary.com\/blog\/guest_post\/video-moderation-with-cloudinary\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/video-moderation-with-cloudinary\/#primaryimage\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681926152\/Web_Assets\/blog\/1f085dc55f519def5378b47faf509ea5c5db6593-225x225-1_278326e12d\/1f085dc55f519def5378b47faf509ea5c5db6593-225x225-1_278326e12d.png?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681926152\/Web_Assets\/blog\/1f085dc55f519def5378b47faf509ea5c5db6593-225x225-1_278326e12d\/1f085dc55f519def5378b47faf509ea5c5db6593-225x225-1_278326e12d.png?_i=AA\",\"width\":225,\"height\":225},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/video-moderation-with-cloudinary\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cloudinary.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Video Moderation with Cloudinary\"}]},{\"@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 Moderation with Cloudinary","description":"Video moderation helps you share highly engaging and effective video content while protecting your brand, customers, and profits. We will create a simple automated video moderation platform that will help us filter out offensive videos.","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-moderation-with-cloudinary\/","og_locale":"en_US","og_type":"article","og_title":"Video Moderation with Cloudinary","og_description":"Video moderation helps you share highly engaging and effective video content while protecting your brand, customers, and profits. We will create a simple automated video moderation platform that will help us filter out offensive videos.","og_url":"https:\/\/cloudinary.com\/blog\/guest_post\/video-moderation-with-cloudinary\/","og_site_name":"Cloudinary Blog","article_published_time":"2022-07-05T06:38:59+00:00","og_image":[{"width":225,"height":225,"url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681926152\/Web_Assets\/blog\/1f085dc55f519def5378b47faf509ea5c5db6593-225x225-1_278326e12d\/1f085dc55f519def5378b47faf509ea5c5db6593-225x225-1_278326e12d.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-moderation-with-cloudinary\/#article","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/guest_post\/video-moderation-with-cloudinary\/"},"author":{"name":"","@id":""},"headline":"Video Moderation with Cloudinary","datePublished":"2022-07-05T06:38:59+00:00","mainEntityOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/guest_post\/video-moderation-with-cloudinary\/"},"wordCount":4,"publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/guest_post\/video-moderation-with-cloudinary\/#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681926152\/Web_Assets\/blog\/1f085dc55f519def5378b47faf509ea5c5db6593-225x225-1_278326e12d\/1f085dc55f519def5378b47faf509ea5c5db6593-225x225-1_278326e12d.png?_i=AA","keywords":["Guest Post","Laravel","PHP","Under Review","Video"],"inLanguage":"en-US","copyrightYear":"2022","copyrightHolder":{"@id":"https:\/\/cloudinary.com\/#organization"}},{"@type":"WebPage","@id":"https:\/\/cloudinary.com\/blog\/guest_post\/video-moderation-with-cloudinary\/","url":"https:\/\/cloudinary.com\/blog\/guest_post\/video-moderation-with-cloudinary\/","name":"Video Moderation with Cloudinary","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/guest_post\/video-moderation-with-cloudinary\/#primaryimage"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/guest_post\/video-moderation-with-cloudinary\/#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681926152\/Web_Assets\/blog\/1f085dc55f519def5378b47faf509ea5c5db6593-225x225-1_278326e12d\/1f085dc55f519def5378b47faf509ea5c5db6593-225x225-1_278326e12d.png?_i=AA","datePublished":"2022-07-05T06:38:59+00:00","description":"Video moderation helps you share highly engaging and effective video content while protecting your brand, customers, and profits. We will create a simple automated video moderation platform that will help us filter out offensive videos.","breadcrumb":{"@id":"https:\/\/cloudinary.com\/blog\/guest_post\/video-moderation-with-cloudinary\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cloudinary.com\/blog\/guest_post\/video-moderation-with-cloudinary\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/guest_post\/video-moderation-with-cloudinary\/#primaryimage","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681926152\/Web_Assets\/blog\/1f085dc55f519def5378b47faf509ea5c5db6593-225x225-1_278326e12d\/1f085dc55f519def5378b47faf509ea5c5db6593-225x225-1_278326e12d.png?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681926152\/Web_Assets\/blog\/1f085dc55f519def5378b47faf509ea5c5db6593-225x225-1_278326e12d\/1f085dc55f519def5378b47faf509ea5c5db6593-225x225-1_278326e12d.png?_i=AA","width":225,"height":225},{"@type":"BreadcrumbList","@id":"https:\/\/cloudinary.com\/blog\/guest_post\/video-moderation-with-cloudinary\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cloudinary.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Video Moderation with Cloudinary"}]},{"@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\/v1681926152\/Web_Assets\/blog\/1f085dc55f519def5378b47faf509ea5c5db6593-225x225-1_278326e12d\/1f085dc55f519def5378b47faf509ea5c5db6593-225x225-1_278326e12d.png?_i=AA","_links":{"self":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/27831","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=27831"}],"version-history":[{"count":0,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/27831\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media\/27832"}],"wp:attachment":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media?parent=27831"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/categories?post=27831"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/tags?post=27831"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}