Api
Version
mediamosa-30Class
mediamosa_rest_call_openapi_searchCode
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_setup, FALSE);
}
// ------------------------------------------------------------------ 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_ID, 0);
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_ID, 0));
// 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'], NULL, FALSE, ($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_ids, FALSE, $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);
}
}
}
}