Upload video on youtube without client authentication using codeigniter
Here we are going to create a form in codeigniter using this form we can upload video on youtube without authentication.
- download library from following link and copy src folder place it in libraries folder.
https://github.com/sameerpspaceo/Youtube_Demo
step 1)
go to google console link where you have to create a project
https://console.developers.google.com/apis
Step 2)
- create new project
- go to library tab
- enable libraries
- YouTube Data API v3, YouTube Analytics API, Gmail API, Google+ API, Google Calendar API
Step 3)
- create credentials for new project
- click on oAuth Client ID.
- select Web application from Application type.
- give your auth oAuth name
- enter you controller Authorized redirect URIs.
Auth Redirect Url
ex:- http://localhost/example/youtube_controller/youtube_upload
- and save it
- copy your Client ID and Client secret.
Step 4)
- if you want to upload video without client authentication you have to follow below steps.
- create the_key.txt file in application folder. This file will save access_token,refresh_token and other details
- create youtubeUpload.log in the root directory to save logs.
- or if not than comment
- create youtubeDelete.log file in application folder.this file will save delete logs
Youtube_controller.php
- Create model User_model.php
- create view file to fill form for upload video videoUpload.php
- must use video title, description,tags and upload file
- download library from following link and copy src folder place it in libraries folder.
https://github.com/sameerpspaceo/Youtube_Demo
step 1)
go to google console link where you have to create a project
https://console.developers.google.com/apis
Step 2)
- create new project
- go to library tab
- enable libraries
- YouTube Data API v3, YouTube Analytics API, Gmail API, Google+ API, Google Calendar API
Step 3)
- create credentials for new project
- click on oAuth Client ID.
- select Web application from Application type.
- give your auth oAuth name
- enter you controller Authorized redirect URIs.
Auth Redirect Url
ex:- http://localhost/example/youtube_controller/youtube_upload
- and save it
- copy your Client ID and Client secret.
Step 4)
- if you want to upload video without client authentication you have to follow below steps.
- create the_key.txt file in application folder. This file will save access_token,refresh_token and other details
- create youtubeUpload.log in the root directory to save logs.
- or if not than comment
$key = file_get_contents(APPPATH.'the_key.txt'); $client->setAccessToken($key); $fp = fopen(APPPATH.'the_key.txt', 'w');fwrite($fp, $json);fclose($fp);
- create youtubeDelete.log file in application folder.this file will save delete logs
Youtube_controller.php
<?php class Youtube_controller extends CI_Controller { public function __construct() { parent::__construct(); $this->load->library('session'); $this->load->helper('url'); $this->load->helper('form'); $this->load->model('user_model'); } /* create function to upload video first on local server and than upload on youtube after successfully upload unlink local server video to clean up space */ function youtube_upload(){ $userId = $this->session->userId; /* add client id here */ $oauthClientID = '*******************************************.apps.googleusercontent.com'; /* add client secret id here */ $oauthClientSecret = '****************'; $baseUri = base_url(); /* add redirect link as you use in Authorized redirect URIs. */ $redirectUri = base_url().'en/youtube_controller/youtube_upload'; define('OAUTH_CLIENT_ID',$oauthClientID); define('OAUTH_CLIENT_SECRET',$oauthClientSecret); define('REDIRECT_URI',$redirectUri); define('BASE_URI',$baseUri); require_once(APPPATH.'libraries/src/autoload.php'); require_once(APPPATH.'libraries/src/Client.php'); require_once(APPPATH.'libraries/src/Service/YouTube.php'); $key = file_get_contents(APPPATH.'the_key.txt'); $client = new Google_Client(); $client->setClientId(OAUTH_CLIENT_ID); $client->setClientSecret(OAUTH_CLIENT_SECRET); $client->setAccessToken($key); $client->setScopes('https://www.googleapis.com/auth/youtube'); $client->setRedirectUri(REDIRECT_URI); $client->setAccessType('offline'); $client->setApprovalPrompt('force'); $youtube = new Google_Service_YouTube($client); $videoTitle = $this->input->post('title'); $videoDesc = $this->input->post('description'); $videoTags = $this->input->post('tags'); $tag = array_filter( explode(",", $videoTags) ); $videoTags = implode(',',$tag); if(isset($_FILES)){ if($_FILES["videoFile"]["name"] != ''){ $user_folder = './upload/youtube_video/'.$userId; if(!is_dir($user_folder)){ mkdir($user_folder, 0777); } $VideoName = str_replace(' ', '_', $_FILES['videoFile']['name']); $configVideo['upload_path'] = $user_folder; # check path is correct $configVideo['allowed_types'] = 'mp4|mpeg|mpg|mov|wmv|avi'; # add video extenstion on here $configVideo['overwrite'] = FALSE; $configVideo['remove_spaces'] = TRUE; $video_name = $userId.'_'.time().'_'.$VideoName; $configVideo['file_name'] = $video_name; $this->load->library('upload', $configVideo); $this->upload->initialize($configVideo); if (!$this->upload->do_upload('videoFile')) # form input field attribute { $this->session->set_flashdata('error', $this->upload->display_errors()); redirect('youtube_controller/upload_video'); } else { $url = 'upload/youtube_video/'.$userId.'/'.$video_name; $upload_video = array('pv_userId'=>$userId,'pv_video_title'=>$videoTitle,'pv_video_description'=>$videoDesc,'pv_video_tags' =>$videoTags,'pv_video_path'=>$url,'pv_updatedBy'=>$userId,'pv_createdDtm'=>date('Y-m-d H:i:s'),'pv_updatedDtm'=>date('Y-m-d H:i:s')); $result = $this->user_model->upload_youtube_video($upload_video); $this->session->set_userdata('uploaded_video',$result); } } } $_SESSION['token'] = $client->getAccessToken(); if (isset($_GET['code'])) { /* if (strval($_SESSION['state']) !== strval($_GET['state'])) { die('The session state did not match.'); } */ $client->authenticate($_GET['code']); $_SESSION['token'] = $client->getAccessToken(); header('Location: ' . REDIRECT_URI); } if (isset($_SESSION['token'])) { $client->setAccessToken($_SESSION['token']); $json = $_SESSION['token']; $fp = fopen(APPPATH.'the_key.txt', 'w'); fwrite($fp, $json); fclose($fp); } $htmlBody = ''; // Check to ensure that the access token was successfully acquired. if ($client->getAccessToken()) { try{ $uploadedVideoId = $this->session->userdata('uploaded_video'); $result = $this->user_model->lastUploadedVideo($uploadedVideoId); // REPLACE this value with the path to the file you are uploading. $videoPath = $result[0]->pv_video_path; // Create a snippet with title, description, tags and category ID // Create an asset resource and set its snippet metadata and type. // This example sets the video's title, description, keyword tags, and // video category. $snippet = new Google_Service_YouTube_VideoSnippet(); $snippet->setTitle($result[0]->pv_video_title); $snippet->setDescription($result[0]->pv_video_description); //$snippet->setTags(explode(",",$result[0]->pv_video_tags)); $snippet->setTags($result[0]->pv_video_tags); //$snippet->setTags('soccer'); // Numeric video category. See // https://developers.google.com/youtube/v3/docs/videoCategories/list $snippet->setCategoryId("22"); // Set the video's status to "public". Valid statuses are "public", // "private" and "unlisted". $status = new Google_Service_YouTube_VideoStatus(); $status->privacyStatus = "public"; // Associate the snippet and status objects with a new video resource. $video = new Google_Service_YouTube_Video(); $video->setSnippet($snippet); $video->setStatus($status); // Specify the size of each chunk of data, in bytes. Set a higher value for // reliable connection as fewer chunks lead to faster uploads. Set a lower // value for better recovery on less reliable connections. $chunkSizeBytes = 1 * 1024 * 1024; // Setting the defer flag to true tells the client to return a request which can be called // with ->execute(); instead of making the API call immediately. $client->setDefer(true); // Create a request for the API's videos.insert method to create and upload the video. $insertRequest = $youtube->videos->insert("status,snippet", $video); // Create a MediaFileUpload object for resumable uploads. $media = new Google_Http_MediaFileUpload( $client, $insertRequest, 'video/*', null, true, $chunkSizeBytes ); $media->setFileSize(filesize($videoPath)); // Read the media file and upload it. $status = false; $handle = fopen( FCPATH.$videoPath, "rb"); while (!$status && !feof($handle)) { $chunk = fread($handle, $chunkSizeBytes); $status = $media->nextChunk($chunk); } fclose($handle); // If you want to make other calls after the file upload, set setDefer back to false $client->setDefer(false); // Update youtube video ID to database //$db->update($result['video_id'],$status['id']); $youtube_video_key = $status['id']; $videoId = $uploadedVideoId; $videoKey = $this->user_model->youtube_videoID($videoId,$youtube_video_key); // delete video file from local folder unlink(FCPATH.$videoPath); $htmlBody .= "<p class='succ-msg'>Video have been uploaded successfully.</p><ul>"; $htmlBody .= '<embed width="400" height="315" src="https://www.youtube.com/embed/'.$status['id'].'"></embed>'; $htmlBody .= '</ul>'; $content = file_get_contents("php://input"); $post = $status; $fp = fopen("youtubeUpload.log","a+"); fwrite($fp,"\n\n\n"); fwrite($fp,"=====================".date('Y-m-d H:i:s')."==========================="); fwrite($fp,ob_get_clean()); fwrite($fp,"\n\n\n"); ob_start(); print_r($post); fwrite($fp,ob_get_clean()); fwrite($fp,"\n\n"); fwrite($fp,"================================================"); fwrite($fp,"\n\n\n"); fclose($fp); $this->session->set_flashdata('video_upload', 'Video have been uploaded successfully'); redirect("youtube_controller/player_video_list"); } catch (Google_ServiceException $e) { /* $htmlBody .= sprintf('<p>A service error occurred: <code>%s</code></p>', htmlspecialchars($e->getMessage())); */ $uploadedVideoId = $this->session->userdata('uploaded_video'); $result = $this->user_model->lastUploadedVideo($uploadedVideoId); $videoPath = $result[0]->pv_video_path; unlink(FCPATH.$videoPath); $content = file_get_contents("php://input"); $post = $e->getMessage(); $fp =fopen("youtubeUpload.log","a+"); fwrite($fp,"\n\n\n"); fwrite($fp,"=====================".date('Y-m-d H:i:s')."==========================="); fwrite($fp,ob_get_clean()); fwrite($fp,"\n\n\n"); ob_start(); print_r($post); fwrite($fp,ob_get_clean()); fwrite($fp,"\n\n"); fwrite($fp,"================================================"); fwrite($fp,"\n\n\n"); fclose($fp); $this->session->set_flashdata('video_upload_error', $e->getMessage()); redirect("youtube_controller/upload_video"); } catch (Google_Exception $e) { /*$htmlBody .= sprintf('<p>An client error occurred: <code>%s</code></p>', htmlspecialchars($e->getMessage())); $htmlBody .= 'Please reset session <a href="'.BASE_URI.'en/youtube_controller/reset_youtube_upload_session">Logout</a>'; */ $uploadedVideoId = $this->session->userdata('uploaded_video'); $result = $this->user_model->lastUploadedVideo($uploadedVideoId); $videoPath = $result[0]->pv_video_path; unlink(FCPATH.$videoPath); $content = file_get_contents("php://input"); $post = $e->getMessage(); $fp =fopen("youtubeUpload.log","a+"); fwrite($fp,"\n\n\n"); fwrite($fp,"=====================".date('Y-m-d H:i:s')."==========================="); fwrite($fp,ob_get_clean()); fwrite($fp,"\n\n\n"); ob_start(); print_r($post); fwrite($fp,ob_get_clean()); fwrite($fp,"\n\n"); fwrite($fp,"================================================"); fwrite($fp,"\n\n\n"); fclose($fp); $this->session->set_flashdata('video_upload_error', $e->getMessage()); redirect("youtube_controller/upload_video"); } }else{ // If the user hasn't authorized the app, initiate the OAuth flow $state = mt_rand(); $client->setState($state); $_SESSION['state'] = $state; $authUrl = $client->createAuthUrl(); $htmlBody = "<h3>Authorization Required</h3> <p>You need to <a href='".$authUrl."'>authorize access</a> before proceeding.<p>"; $this->session->set_flashdata('video_upload_error', $htmlBody); redirect("youtube_controller/upload_video"); } $this->isFrontLoggedIn(); $currentURL = $this->uri->segment(3); $this->lang->load('label'); $userId = $this->session->userId; $data['userDetail'] = $this->user_model->getUserDetail($userId); $data['clang'] = $this->uri->segment(1); $data['userInfo'] = $this->user_model->getUserInfo($userId); $data['youtube_response'] = $htmlBody; $this->load->view('includes/header',$data); $this->load->view('validation_msg'); $this->load->view('myaccount_sidebar',$data); $this->load->view('upload_video',$data); $this->load->view('includes/footer',$data); } /* Delete uploaded video with youtube video key used ajax to delete video call this function from video list and pass videoId and uploader id from form */ function delete_uploadVideo(){ $this->isFrontLoggedIn(); $userId = $this->session->userId; /* get video Id from your post */ $videoId = $this->input->post('videoId'); /* check from database posted videoId is uploaded by user or not */ $videoStatus = $this->user_model->checkVideoUploader($videoId,$userId); if(empty($videoStatus)){ $response['code'] = '0'; $response['msg'] = 'You are not uploader of this video'; echo json_encode($response); die; } $oauthClientID = '**********************************.apps.googleusercontent.com'; $oauthClientSecret = '**********************'; $baseUri = base_url(); $redirectUri = base_url().'en/youtube_controller/youtube_upload'; define('OAUTH_CLIENT_ID',$oauthClientID); define('OAUTH_CLIENT_SECRET',$oauthClientSecret); require_once(APPPATH.'libraries/src/autoload.php'); require_once(APPPATH.'libraries/src/Client.php'); require_once(APPPATH.'libraries/src/Service/YouTube.php'); $key = file_get_contents(APPPATH.'the_key.txt'); $client = new Google_Client(); $client->setClientId(OAUTH_CLIENT_ID); $client->setClientSecret(OAUTH_CLIENT_SECRET); $client->setAccessToken($key); $client->setScopes('https://www.googleapis.com/auth/youtube'); $client->setAccessType('offline'); $client->setApprovalPrompt('force'); $youtube = new Google_Service_YouTube($client); $_SESSION['token'] = $client->getAccessToken(); if (isset($_GET['code'])) { // if (strval($_SESSION['state']) !== strval($_GET['state'])) { // die('The session state did not match.'); //} $client->authenticate($_GET['code']); $_SESSION['token'] = $client->getAccessToken(); header('Location: ' . REDIRECT_URI); } if (isset($_SESSION['token'])) { $client->setAccessToken($_SESSION['token']); $json = $_SESSION['token']; } if ($client->getAccessToken()) { try{ error_reporting(0); $youtube->videos->delete($videoId); $videoDetail = array('pv_isDeleted'=>'1','pv_updatedBy'=>$userId,'pv_updatedDtm'=>date('Y-m-d H:i:s')); $videoKey = $this->user_model->deleteYoutube($videoId,$videoDetail); $videoDeleted = array(); $videoDeleted['video_id'] = $videoId; $videoDeleted['deletedBy'] = $userId; $videoDeleted['time'] = date('Y-m-d H:i:s'); $content = file_get_contents("php://input"); $post = $videoDeleted; $fp =fopen("youtubeDelete.log","a+"); fwrite($fp,"\n\n\n"); fwrite($fp,"=====================".date('Y-m-d H:i:s')."==========================="); fwrite($fp,ob_get_clean()); fwrite($fp,"\n\n\n"); ob_start(); print_r($post); fwrite($fp,ob_get_clean()); fwrite($fp,"\n\n"); fwrite($fp,"================================================"); fwrite($fp,"\n\n\n"); fclose($fp); $response['code'] = '1'; $response['msg'] = 'Video deleted successfully'; echo json_encode($response); die; }catch (Google_ServiceException $e) { $htmlBody .= sprintf('<p>A service error occurred: <code>%s</code></p>', $e->getMessage()); $content = file_get_contents("php://input"); $post = $htmlBody; $fp =fopen("youtubeDelete.log","a+"); fwrite($fp,"\n\n\n"); fwrite($fp,"=====================".date('Y-m-d H:i:s')."==========================="); fwrite($fp,ob_get_clean()); fwrite($fp,"\n\n\n"); ob_start(); print_r($post); fwrite($fp,ob_get_clean()); fwrite($fp,"================================================"); fwrite($fp,"\n\n\n"); fclose($fp); $response['code'] = '0'; $response['msg'] = $e->getMessage(); echo json_encode($response); die; }catch (Google_Exception $e) { $htmlBody .= sprintf('<p>An client error occurred: <code>%s</code></p>', $e->getMessage()); $content = file_get_contents("php://input"); $post = $htmlBody; $fp =fopen("youtubeDelete.log","a+"); fwrite($fp,"\n\n\n"); fwrite($fp,"=====================".date('Y-m-d H:i:s')."==========================="); fwrite($fp,ob_get_clean()); fwrite($fp,"\n\n\n"); ob_start(); print_r($post); fwrite($fp,ob_get_clean()); fwrite($fp,"================================================"); fwrite($fp,"\n\n\n"); fclose($fp); $response['code'] = '0'; $response['msg'] = 'The video that you are trying to delete cannot be found.'; echo json_encode($response); die; } }else { // If the user hasn't authorized the app, initiate the OAuth flow $state = mt_rand(); $client->setState($state); $_SESSION['state'] = $state; $authUrl = $client->createAuthUrl(); $htmlBody = "<h3>Authorization Required</h3> <p>You need to <a href='".$authUrl."'>authorize access</a> before proceeding.<p>"; $content = file_get_contents("php://input"); $post = $htmlBody; $fp =fopen("youtubeDelete.log","a+"); fwrite($fp,"\n\n\n"); fwrite($fp,"=====================".date('Y-m-d H:i:s')."==========================="); fwrite($fp,ob_get_clean()); fwrite($fp,"\n\n\n"); ob_start(); print_r($post); fwrite($fp,ob_get_clean()); fwrite($fp,"\n\n"); fwrite($fp,"================================================"); fwrite($fp,"\n\n\n"); fclose($fp); } } } ?>
- Create model User_model.php
<?php
function upload_youtube_video($upload_video){
$this->db->insert('tbl_playervideos', $upload_video);
$insert_id = $this->db->insert_id();
return $insert_id;
}
function lastUploadedVideo($uploadedVideoId){
$this->db->select('*');
$this->db->from('tbl_playervideos');
$this->db->where('pv_video_id', $uploadedVideoId);
$query = $this->db->get();
$result = $query->result();
return $result;
}
function youtube_videoID($videoId,$youtube_video_key){
$this->db->set('pv_youtube_video_id', $youtube_video_key);
$this->db->where('pv_video_id', $videoId);
$this->db->update('tbl_playervideos');
return $this->db->affected_rows();
}
function getUserInfo($userId)
{
$this->db->select('*');
$this->db->from('tbl_users');
$this->db->where('isDeleted', 0);
$this->db->where('roleId !=', 1);
$this->db->where('userId', $userId);
$query = $this->db->get();
return $query->result();
}
function getUserDetail($userId)
{
$this->db->select('*');
$this->db->from('tbl_userdetail');
$this->db->where('ud_userId', $userId);
$query = $this->db->get();
return $query->result();
}
function checkVideoUploader($videoId,$userId){
$this->db->select('*');
$this->db->from('tbl_playervideos');
$this->db->where('pv_youtube_video_id', $videoId);
$this->db->where('pv_userId', $userId);
$query = $this->db->get();
$result = $query->result();
return $result;
}
function deleteYoutube($videoId,$videoDetail){
$this->db->where('pv_youtube_video_id', $videoId);
$this->db->update('tbl_playervideos', $videoDetail);
return $this->db->affected_rows();
}
?>
- create view file to fill form for upload video videoUpload.php
- must use video title, description,tags and upload file
<form id="multiple_upload_form" enctype="multipart/form-data" action="<?php echo base_url($clang.'/youtube_controller/youtube_upload');?>" method="post">
<div class="box-body">
<div class="form-group">
<label for="title">Title:</label><input type="text" name="title" id="title" class="form-control" value="" / >
</div>
<div class="form-group">
<label for="description">Description:</label> <textarea name="description" id="description" class="form-control" cols="20" rows="2" ></textarea>
</div>
<div class="form-group">
<label for="tags">Tags:</label>
<select name="tags[]" multiple="multiple" class="tags form-control">
<option value="cartoon">Cartoon</option>
<option value="fun">Fun</option>
<option value="soccer">Soccer</option>
<option value="new">New</option>
</select>
</div>
<br>
<div class="form-group">
<label for="video_file">Choose Video File:</label> <input type="file" name="videoFile" id="videoFile" class="form-control" >
</div>
<div class="form-group">
<input class="btn btn-default" id="submit_video" type="submit" value="Upload">
</div>
</div>
</form>
Comments
Post a Comment