upload facility now works in single CIS mode; some simple command-line video moderati...
[living-lab-site.git] / application / controllers / video.php
index eb89005..283851d 100644 (file)
@@ -9,6 +9,9 @@
  */
 class Video extends CI_Controller {
 
+       protected $uploaded_file;
+       protected $av_info;
+       
        public function __construct()
        {
                parent::__construct();
@@ -18,22 +21,17 @@ class Video extends CI_Controller {
        
        public function index()
        {
+               //phpinfo();
        }
        
        public function test()
        {
-               $r = new HttpRequest('http://example.com/form.php', HttpRequest::METH_POST);
-               $r->setOptions(array('cookies' => array('lang' => 'de')));
-               $r->addPostFields(array('user' => 'mike', 'pass' => 's3c|r3t'));
-               $r->addPostFile('image', 'profile.jpg', 'image/jpeg');
-               try
-               {
-                       echo $r->send()->getBody();
-               }
-               catch (HttpException $ex) 
-               {
-                       echo $ex;
-               }
+               $this->load->model('videos_model');
+               
+               $videos = $this->videos_model->get_videos_summary(1, NULL, 0, 10,
+                               'alphabetically', TRUE);
+               
+               var_dump($videos);
        }
        
        /**
@@ -49,17 +47,67 @@ class Video extends CI_Controller {
                // **
                // ** LOADING MODEL
                // **
-               // Retrieve video information.
                $this->load->model('videos_model');
-               $this->videos_model->inc_views($id);
+               
+               $data['user_id'] = $this->session->userdata('user_id');
+               if ($data['user_id'] === FALSE)
+                       $data['user_id'] = '';
+               else
+                       $data['user_id'] = intval($data['user_id']);
+               $user_roles = intval($this->session->userdata('roles'));
+//             echo USER_ROLE_ADMIN . ' / ';
+//             var_dump($user_roles);
+//             var_dump($user_roles | USER_ROLE_ADMIN);
+//             die();
+               
+               // Retrieve video information.
                $data['video'] = $this->videos_model->get_video($id, $name);
+               if ($data['video'] === FALSE)
+               {       
+                       $this->load->helper('message');
+                       show_error_msg_page($this, 
+                               $this->lang->line('video_msg_no_video'));
+                       return;
+               }
+               
+               // Video is being processed by CIS.
+               if ($data['video']['activation_code']
+                               && !$data['video']['content_ingested'])
+               {
+                       $this->load->helper('message');
+                       show_error_msg_page($this, 
+                               $this->lang->line('video_msg_video_not_ready'));
+                       return;
+               }
+               
+               // Unlogged in user can't see unactivated videos.
+               if (empty($data['user_id']))
+                       $allow_unactivated = FALSE;
+               else
+               {
+                       if (($user_roles & USER_ROLE_ADMIN) == 0
+                                       && $data['user_id'] != $data['video']['user_id'])
+                               $allow_unactivated = FALSE;
+                       else
+                               $allow_unactivated = TRUE;
+               }
+               
+               // Video is not activated; can be seen by owner and admin.
+               if ($data['video']['activation_code'] && !$allow_unactivated)
+               {
+                       $this->load->helper('message');
+                       show_error_msg_page($this, 
+                               $this->lang->line('video_msg_video_unactivated'));
+                       return;
+               }                       
+               
                $categories = $this->config->item('categories');
                $data['video']['category_name'] = 
                        $categories[ $data['video']['category_id'] ];
                $data['plugin_type'] = ($plugin === NULL ? 'auto' : $plugin);
-               $data['user_id'] = $this->session->userdata('user_id');
-               if ($data['user_id'] === FALSE)
-                       $data['user_id'] = '';
+               
+               // Increment the number of views for the video.
+               $this->videos_model->inc_views($id);
                
                // Display page.
                $params = array(        'title' => $data['video']['title'] . ' – '
@@ -104,13 +152,22 @@ class Video extends CI_Controller {
                
        public function upload()
        {
+               $user_id = $this->session->userdata('user_id');
+               
+               // Action not possible if an user is not logged in.
+               if (!$user_id)
+               {
+                       $this->load->helper('message');
+                       show_error_msg_page($this, 
+                               $this->lang->line('ui_msg_login_restriction'));
+                       return;
+               }
+               
                $this->load->library('form_validation');
 
                $this->form_validation->set_error_delimiters('<span class="error">',
                                '</span>');
                
-               // TODO check if user is logged in
-
                if ($this->form_validation->run('upload') === FALSE)
                {
                        $params = array('title' =>
@@ -140,21 +197,51 @@ class Video extends CI_Controller {
                {
                        $this->load->model('videos_model');
                        $this->load->helper('video');
+                       $this->config->load('content_ingestion');
+                       
+                       $name = urlencode(str_replace(' ', '-',
+                                       $this->input->post('video-title')));
+                       $category_id = $this->input->post('video-category');
                        
-                       $file_name = './data/upload/'. $_FILES['video-upload-file']['name'];
-                       $av_info = get_av_info($file_name);
+                       // Prepare formats
+                       $formats = $this->config->item('formats');
+                       $prepared_formats = prepare_formats($formats, $this->av_info,
+                                       $this->config->item('elim_dupl_res'));
                        
-                       // TODO category_id, user_id
-//                     $this->videos_model->add_video(
-//                                     $this->input->post('video-title'),
-//                                     $this->input->post('video-description'),
-//                                     $this->input->post('video-tags'),
-//                                     $av_info, 0, 1);
+                       // Add video to DB.
+                       $activation_code = $this->videos_model->add_video($name,
+                                       $this->input->post('video-title'),
+                                       $this->input->post('video-description'),
+                                       $this->input->post('video-tags'),
+                                       $this->av_info['duration'],
+                                       $prepared_formats['db_formats'], $category_id, $user_id,
+                                       $this->uploaded_file);
                        
-                       // TODO call CIS
+                       // Send a content ingestion request to
+                       // CIS (Content Ingestion Server).
+                       $this->_send_content_ingestion($activation_code,
+                                       $this->uploaded_file,
+                                       $name, $this->av_info['size'],
+                                       $prepared_formats['transcode_configs']);
+                       
+                       $this->load->helper('message');
+                       show_info_msg_page($this, 
+                               $this->lang->line('video_msg_video_uploaded'));
                }
        }
        
+       public function cis_completion($activation_code)
+       {
+               $this->load->model('videos_model');
+               
+               if ($this->config->item('require_moderation'))
+                       $this->videos_model->set_content_ingested($activation_code);
+               else
+                       $this->videos_model->activate_video($activation_code);
+               
+//             log_message('info', "cis_completion $activation_code");
+       }
+       
        /**
        * Increments (dis)likes count for video with the specified id and returns to
        * the client as plain text the number if likes.
@@ -251,6 +338,50 @@ class Video extends CI_Controller {
                        return $output;
        }
        
+       /**
+        * Request content_ingest to the CIS in order to start the content
+        * ingestion process.
+        * 
+        * @param string $activation_code
+        * @param string $raw_video_fn uploaded video file name
+        * @param string $name
+        * @param int $raw_video_size uploaded video file size in bytes
+        * @param array $transcode_configs dictionary which must be included in
+        * the JSON data that needs to be sent to CIS
+        * @return mixed return the HTTP content (body) on success and FALSE
+        * otherwise
+        */
+       protected function _send_content_ingestion($activation_code, $raw_video_fn,
+                       $name, $raw_video_size, $transcode_configs)
+       {
+               $this->config->load('content_ingestion');
+               
+               $url = $this->config->item('cis_url') . 'ingest_content';
+               $data = array(
+                       'code'=>$activation_code,
+                       'raw_video'=>$raw_video_fn,
+                       'name'=>$name,
+                       'weight'=>$raw_video_size,
+                       'transcode_configs'=>$transcode_configs,
+                       'thumbs'=>$this->config->item('thumbs_count')
+               );
+               $json_data = json_encode($data);
+               
+               // Send request to CIS.
+               $r = new HttpRequest($url, HttpRequest::METH_POST);
+               $r->setBody($json_data);
+               try
+               {
+                       $response = $r->send()->getBody();
+               }
+               catch (HttpException $ex) 
+               {
+                       return FALSE;
+               }
+               
+               return $response;
+       }
+       
        public function _is_user_loggedin($param)
        {
                if (! $this->session->userdata('user_id'))
@@ -297,6 +428,14 @@ class Video extends CI_Controller {
 
                        if ($this->upload->do_upload('video-upload-file'))
                        {
+                               $upload_data = $this->upload->data();
+                               $this->uploaded_file = $upload_data['file_name'];
+                               
+                               $this->load->helper('video');
+                               $this->av_info = get_av_info($upload_data['full_path']);
+                               if (!$this->av_info)
+                                       return FALSE;
+                               
                                return TRUE;
                        }
                        else