Api

Version

mediamosa-30

Class

mediamosa_rest_call_openapi_search

Code

File: /sites/all/modules/mediamosa/modules/openapi/mediamosa_openapi.rest.class.inc
<?php?php
// $Id$

/**
 * MediaMosa is Open Source Software to build a Full Featured, Webservice
 * Oriented Media Management and Distribution platform (http://mediamosa.org)
 *
 * Copyright (C) 2011 SURFnet BV (http://www.surfnet.nl) and Kennisnet
 * (http://www.kennisnet.nl)
 *
 * MediaMosa is based on the open source Drupal platform and
 * was originally developed by Madcap BV (http://www.madcap.nl)
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, you can find it at:
 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
 */

/**
 * @file
 * OpenAPI rest calls.
 */


/**
 * URI: /openapi/search
 * Method: GET
 */
class mediamosa_rest_call_openapi_search extends mediamosa_rest_call {
  
// ------------------------------------------------------------------ Consts.
  // Rest vars;
  
const QUERY 'query';
  const 
QLIMIT 'qlimit';
  const 
QOFFSET 'qoffset';
  const 
QORDER 'qorder';
  const 
QDIRECTION 'qdirection';
  const 
SUBJECT 'subject';
  const 
LANGUAGE 'language';
  const 
LOCATION 'location';
  const 
SINCE 'since';
  const 
UNTIL 'until';
  const 
AUTHOR 'author';
  const 
CONTRIBUTOR 'contributor';
  const 
PUBLISHER 'publisher';
  const 
CATEGORY 'category';
  const 
FORMAT 'format';
  const 
DURATION 'duration';
  const 
CALLBACK 'callback';

  const 
ALT 'alt';
  const 
REQUEST_PARAMETER_FORMAT_VALUE 'Request-Parameter-Format-Value';
  const 
REQUEST_PARAMETER_FORMET_VALUE 'Request-Parameter-Formet-Value';

  
// Other vars;
  
const DEFAULT_LIMIT 10;
  const 
DEFAULT_OFFSET 0;

  
// ------------------------------------------------------------------ Functions (public).
  
public function get_var_setup() {
    
$a_var_setup = array(
      
self::VARS => array(
        
self::ALT => array(
          
self::VAR_TYPE => mediamosa_sdk::TYPE_RESPONSE_TYPE,
          
self::VAR_IS_REQUIRED => self::VAR_IS_REQUIRED_NO,
          
self::VAR_ALLOWED_VALUES => array(
            
mediamosa_response::RESPONSE_TYPE_XML,
            
mediamosa_response::RESPONSE_TYPE_ATOM,
            
mediamosa_response::RESPONSE_TYPE_RSS,
            
mediamosa_response::RESPONSE_TYPE_JSON,
          ),
          
self::VAR_DESCRIPTION => mediamosa::t('Optional parameter to specify the response output format.'),
        ),
        
self::REQUEST_PARAMETER_FORMET_VALUE => array(
          
self::VAR_TYPE => mediamosa_sdk::TYPE_RESPONSE_TYPE,
          
self::VAR_IS_REQUIRED => self::VAR_IS_REQUIRED_NO,
          
self::VAR_ALLOWED_VALUES => array(
            
mediamosa_response::RESPONSE_TYPE_XML,
            
mediamosa_response::RESPONSE_TYPE_ATOM,
            
mediamosa_response::RESPONSE_TYPE_RSS,
            
mediamosa_response::RESPONSE_TYPE_JSON,
          ),
          
self::VAR_DESCRIPTION => mediamosa::t('Optional parameter to specify the response output format.'),
        ),
        
self::REQUEST_PARAMETER_FORMAT_VALUE => array(
          
self::VAR_TYPE => mediamosa_sdk::TYPE_RESPONSE_TYPE,
          
self::VAR_IS_REQUIRED => self::VAR_IS_REQUIRED_NO,
          
self::VAR_ALLOWED_VALUES => array(
            
mediamosa_response::RESPONSE_TYPE_XML,
            
mediamosa_response::RESPONSE_TYPE_ATOM,
            
mediamosa_response::RESPONSE_TYPE_RSS,
            
mediamosa_response::RESPONSE_TYPE_JSON,
          ),
          
self::VAR_DESCRIPTION => mediamosa::t('Optional parameter to specify the response output format.'),
        ),
        
self::QUERY => array(
          
self::VAR_TYPE => mediamosa_sdk::TYPE_STRING,
          
self::VAR_DESCRIPTION => 'Search query.',
          
self::VAR_IS_REQUIRED => self::VAR_IS_REQUIRED_YES,
        ),
        
self::SUBJECT => array(
          
self::VAR_TYPE => mediamosa_sdk::TYPE_ALPHA,
          
self::VAR_DESCRIPTION => 'The subject mapped to DC:subject.',
        ),
        
self::LANGUAGE => array(
          
self::VAR_TYPE => mediamosa_sdk::TYPE_ALPHA,
          
self::VAR_DESCRIPTION => 'The language mapped to DC:language.',
        ),
        
self::LOCATION => array(
          
self::VAR_TYPE => mediamosa_sdk::TYPE_ALPHA,
          
self::VAR_DESCRIPTION => 'The location mapped to DC:coverage_spatial.',
        ),
        
self::SINCE => array(
          
self::VAR_TYPE => mediamosa_sdk::TYPE_DATETIME_UTC,
          
self::VAR_DESCRIPTION => 'The since mapped to videotimestamp (search from a date).',
        ),
        
self::UNTIL => array(
          
self::VAR_TYPE => mediamosa_sdk::TYPE_DATETIME_UTC,
          
self::VAR_DESCRIPTION => 'The until mapped to videotimestamp (search till a date).',
        ),
        
self::AUTHOR => array(
          
self::VAR_TYPE => mediamosa_sdk::TYPE_ALPHA,
          
self::VAR_DESCRIPTION => 'The author mapped to DC:creator.',
        ),
        
self::CONTRIBUTOR => array(
          
self::VAR_TYPE => mediamosa_sdk::TYPE_ALPHA,
          
self::VAR_DESCRIPTION => 'The contributor mapped to DC:contributor.',
        ),
        
self::PUBLISHER => array(
          
self::VAR_TYPE => mediamosa_sdk::TYPE_ALPHA,
          
self::VAR_DESCRIPTION => 'The publisher mapeed to DC:publisher.',
        ),
        
self::CATEGORY => array(
          
self::VAR_TYPE => mediamosa_sdk::TYPE_ALPHA_NUM,
          
self::VAR_DESCRIPTION => 'The category mapped to coll_id.',
        ),
        
self::FORMAT => array(
          
self::VAR_TYPE => mediamosa_sdk::TYPE_ALPHA,
          
self::VAR_DESCRIPTION => 'The format mapped to content type of mediafile.',
        ),
        
self::DURATION => array(
          
self::VAR_TYPE => mediamosa_sdk::TYPE_STRING,
          
self::VAR_DESCRIPTION => 'The duration mappped to the duration of mediafile.',
        ),
        
self::CALLBACK => array(
          
self::VAR_TYPE => mediamosa_sdk::TYPE_ALPHA,
          
self::VAR_DESCRIPTION => 'The callback for JSON.',
        ),
      )
    );

    
// Include limit, offset vars.
    
$a_var_setup self::get_var_setup_range($a_var_setup);
    
// Alter the params.
    
$a_var_setup[self::VARS][self::QLIMIT] = $a_var_setup[self::VARS][self::LIMIT];
    
$a_var_setup[self::VARS][self::QOFFSET] = $a_var_setup[self::VARS][self::OFFSET];
    unset(
$a_var_setup[self::VARS][self::LIMIT]);
    unset(
$a_var_setup[self::VARS][self::OFFSET]);

    
// Include order by.
    
$a_var_setup self::get_var_setup_order_by($a_var_setup);
    
// Alter the params.
    
$a_var_setup[self::VARS][self::QORDER] = $a_var_setup[self::VARS][self::ORDER_BY];
    
$a_var_setup[self::VARS][self::QDIRECTION] = $a_var_setup[self::VARS][self::ORDER_DIRECTION];
    unset(
$a_var_setup[self::VARS][self::ORDER_BY]);
    unset(
$a_var_setup[self::VARS][self::ORDER_DIRECTION]);

    
// Enrich with required REST vars.
    
return self::get_var_setup_default($a_var_setupFALSE);
  }

  
// ------------------------------------------------------------------ Override Validate Rest Args.
  
protected function validate_rest_args(array $a_var_setup) {

    
// Validate first.
    
parent::validate_rest_args($a_var_setup);

    
$app_id variable_get(mediamosa_settings::MEDIAMOSA_OPENAPI_OPEN_APP_ID0);

    if (!
$app_id) {
      throw new 
mediamosa_exception_error(mediamosa_error::ERRORCODE_OPENAPI_MISSING_OPEN_APP_ID);
    }
  }

  
// ------------------------------------------------------------------ Do Call.
  
public function do_call() {
    
$mediamosa mediamosa::get();

    
$app_ids = array(variable_get(mediamosa_settings::MEDIAMOSA_OPENAPI_OPEN_APP_ID0));

    
// Get params.
    
$limit $this->get_param_value(self::QLIMIT);
    
$offset $this->get_param_value(self::QOFFSET);
    
$order_by $this->get_param_value(self::QORDER);
    
$order_direction $this->get_param_value(self::QDIRECTION);
    
$callback $this->get_param_value(self::CALLBACK);

    
$cql = array();

    
// Get params with escape.
    
$query addslashes($this->get_param_value(self::QUERY));
    
$subject addslashes($this->get_param_value(self::SUBJECT));
    
$language addslashes($this->get_param_value(self::LANGUAGE));
    
$location addslashes($this->get_param_value(self::LOCATION));
    
$since addslashes($this->get_param_value(self::SINCE));
    
$until addslashes($this->get_param_value(self::UNTIL));
    
$author addslashes($this->get_param_value(self::AUTHOR));
    
$contributor addslashes($this->get_param_value(self::CONTRIBUTOR));
    
$publisher addslashes($this->get_param_value(self::PUBLISHER));
    
$category addslashes($this->get_param_value(self::CATEGORY));
    
$format addslashes($this->get_param_value(self::FORMAT));
    
$duration addslashes($this->get_param_value(self::DURATION));

    if (
$query) {
      
$cql[] = '(title="' $query '" OR description="' $query '")';
    }

    if (
$subject) {
      
$cql[] = 'subject="' $subject '"';
    }

    if (
$language) {
      
$cql[] = 'language="' $language '"';
    }

    if (
$location) {
      
$cql[] = 'coverage_spatial="' $location '"';
    }

    if (
$this->isset_param(self::SINCE)) {
      
$cql[] = 'videotimestamp>="' $since '"';
    }

    if (
$this->isset_param(self::UNTIL)) {
      
$cql[] = 'videotimestamp<="' $until '"';
    }

    if (
$author) {
      
$cql[] = 'creator="' $author '"';
    }

    if (
$contributor) {
      
$cql[] = 'contributor="' $contributor '"';
    }

    if (
$publisher) {
      
$cql[] = 'publisher="' $publisher '"';
    }

    if (
$category) {
      
$cql[] = 'coll_id="' $category '"';
    }

    if (
$format) {
      
$cql[] = 'mediafile_container_type="' $format '"';
    }

    if (
$duration) {
      
$cql[] = 'mediafile_duration="' $duration '"';
    }

    
// Gluing CQL.
    
$cql implode(' AND '$cql);

    
// TODO: Implement callback.

    // Add possible order by to the CQL.
    
if ($order_by != '' && $cql) {
      
$cql .= (!empty($cql) ? ' ' '') . 'sortby ' $order_by;
      
$cql .= (empty($order_direction) ? '' '/' . (mediamosa_unicode::strtolower($order_direction) == mediamosa_type::ORDER_DIRECTION_ASC 'ascending' 'descending'));
    }

    if (
$cql) {
      
$asset_ids mediamosa_search::asset(array(
        
'app_ids' => $app_ids,
        
'cql' => $cql,
        
'cql_store_stats' => TRUE,
        
'limit' => $limit,
        
'offset' => $offset,
        
'show_deleted' => FALSE,
      ));

      
// Fill response.
      
$acl_user_id '';
      
$granted '';
      
$acl_group_ids = array();
      
$acl_domain '';
      
$acl_realm '';
      
$show_stills TRUE;
      
$show_collections FALSE;
      
$add_has_streamable_mediafiles FALSE;
      
$items mediamosa_asset::asset_collect(
        
$asset_ids['asset_ids'],
        
$app_ids,
        
$acl_user_id,
        
$granted,
        
$acl_group_ids,
        
$acl_domain,
        
$acl_realm,
        
$this->get_param_value(self::IS_APP_ADMIN),
        
$show_stills,
        
$show_collections,
        
$add_has_streamable_mediafiles
      
);

      foreach (
$items as $item) {
        
// Fix app_id.
        
$app_id in_array($item['app_id'], $app_ids) ? $item['app_id'] : reset($app_ids);

        
// Add mediafiles.
        
$mediafile_ids mediamosa_asset_mediafile::mediafiles_search($item['asset_id'], NULLFALSE, ($item['app_id'] == $app_id ? array() : $app_ids));

        
// Now enrich the output with mediafiles.
        
$show_stills TRUE;
        
$item['mediafiles'] = mediamosa_asset_mediafile::enrich_response_mediafile($mediafile_ids$app_idsFALSE$show_stills);

        
// Add streamable setting on asset.
        
$item['has_streamable_mediafiles'] = mediamosa_asset::enrich_response_has_streamable_mediafiles($item['mediafiles']['mediafile']) ? 'TRUE' 'FALSE';

        if (!empty(
$item['mediafiles']['mediafile']) && is_array($item['mediafiles']['mediafile'])) {
          
$mediafile reset($item['mediafiles']['mediafile']);

          if (!empty(
$mediafile['still']) && is_array($mediafile['still'])) {
            
$still reset($mediafile['still']);
          }

          
$item['mediaitem'] = array(
            
'album_id' => $item['asset_id'],
            
'created' => !empty($item['qualified_dublin_core']['created']) ? $item['qualified_dublin_core']['created'] : NULL,
            
'description' => !empty($item['dublin_core']['description']) ? $item['dublin_core']['description'] : NULL,
            
'duration' => !empty($mediafile['metadata']['file_duration']) ? $mediafile['metadata']['file_duration'] : NULL,
            
'file_size' => !empty($mediafile['metadata']['filesize']) ? $mediafile['metadata']['filesize'] : NULL,
            
'id' => !empty($mediafile['mediafile_id']) ? $mediafile['mediafile_id'] : NULL,
            
'language' => !empty($item['dublin_core']['language']) ? $item['dublin_core']['language'] : NULL,
            
'last_updated' => !empty($mediafile['changed']) ? $mediafile['changed'] : NULL,
            
'location' => NULL,
            
'mime_type' => !empty($mediafile['metadata']['mime_type']) ? $mediafile['metadata']['mime_type'] : NULL,
            
'num_comments' => NULL,
            
'num_views' => !empty($item['viewed']) ? $item['viewed'] : NULL,
            
'num_votes' => NULL,
            
'rating' => NULL,
            
'start_time' => NULL,
            
'tagged_people' => NULL,
            
'tags' => !empty($mediafile['tag']) ? array($mediafile['tag']) : NULL,
            
'still_url' => !empty($still['still_ticket']) ? $still['still_ticket'] : NULL,
            
'title' => !empty($item['dublin_core']['title'][0]) ? $item['dublin_core']['title'][0] : NULL,
            
'type' => !empty($item['dublin_core']['type'][0]) ? $item['dublin_core']['type'][0] : NULL,
            
'url' => !empty($mediafile['uri']) ? $mediafile['uri'] : NULL,
          );
        }

        
$mediamosa->add_item($item);
      }
    }
  }
}