Api
Version
mediamosa-30Class
mediamosa_rest_call_openapi_uploadCode
File: /sites/all/modules/mediamosa/modules/openapi/mediamosa_openapi.rest.class.inc
<?php
/**
* URI: /openapi/album/$album_id
* URI: /openapi/album/$album_id/mediaitem
* URI: /openapi/album/$album_id/mediaitem/$mediaitem_id
*
* Method: POST
*
*/
class mediamosa_rest_call_openapi_upload extends mediamosa_rest_call {
// ------------------------------------------------------------------ Consts.
// Rest vars;
const USER_ID = 'user_id';
// Standard Request Parameters.
const REQUEST_PARAMETER_UPDATEDSINCE_VALUE = 'Request-Parameter-UpdatedSince-Value';
const REQUEST_PARAMETER_FORMAT_VALUE = 'Request-Parameter-Format-Value';
const REQUEST_PARAMETER_FORMET_VALUE = 'Request-Parameter-Formet-Value';
// Call related paramters.
const ALBUM_ID = 'album_id';
// Data parameters.
const MEDIAITEM_ID = 'id';
//
const CREATED = 'created';
const DESCRIPTION = 'description';
const DURATION = 'duration';
const FILE_SIZE = 'file_size';
const LANGUAGE = 'language';
const LAST_UPDATED = 'last_updated';
const LOCATION = 'location';
const MIME_TYPE = 'mime_type';
const NUM_COMMENTS = 'num_comments';
const NUM_VIEWS = 'num_views';
const NUM_VOTES = 'num_votes';
const RATING = 'rating';
const START_TIME = 'start_time';
const TAGGED_PEOPLE = 'tagged_people';
const TAGS = 'tags';
const STILL_URL = 'still_url';
const TITLE = 'title';
const TYPE = 'type';
const URL = 'url';
// ------------------------------------------------------------------ Get Var Setup.
public function get_var_setup() {
$a_var_setup = array(
self::VARS => array(
self::USER_ID => array(
self::VAR_TYPE => mediamosa_sdk::TYPE_USER_ID,
self::VAR_DESCRIPTION => 'User id.',
),
// Standard Request Parameters.
self::REQUEST_PARAMETER_UPDATEDSINCE_VALUE => array(
self::VAR_TYPE => mediamosa_sdk::TYPE_DATETIME_UTC,
self::VAR_DESCRIPTION => 'Only return items whose updated date & time is equal to or more recent then the specified value (e.g. 2008-01-23T04:56:22Z).',
),
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('The response type paramter.'),
),
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('The response type paramter.'),
),
// Call related paramters.
self::ALBUM_ID => array(
self::VAR_TYPE => mediamosa_sdk::TYPE_COLLECTION_ID,
self::VAR_DESCRIPTION => 'Album to which the media item belongs. ',
),
// Data parameters.
self::MEDIAITEM_ID => array(
self::VAR_TYPE => mediamosa_sdk::TYPE_MEDIAFILE_ID,
self::VAR_DESCRIPTION => 'Id Associated with the media item.',
),
//
self::CREATED => array(
self::VAR_TYPE => mediamosa_sdk::TYPE_DATETIME_UTC,
self::VAR_DESCRIPTION => 'Creation datetime associated with the media item - assigned by container in UTC (e.g. 2008-01-23T04:56:22Z).',
),
self::DESCRIPTION => array(
self::VAR_TYPE => mediamosa_sdk::TYPE_STRING,
self::VAR_DESCRIPTION => 'Description of the media item.',
),
self::DURATION => array(
self::VAR_TYPE => mediamosa_sdk::TYPE_INT,
self::VAR_DESCRIPTION => 'For audio/video clips - playtime length in seconds. set to -1/not defined if unknown.',
self::VAR_DEFAULT_VALUE => -1,
),
self::FILE_SIZE => array(
self::VAR_TYPE => mediamosa_sdk::TYPE_INT,
self::VAR_DESCRIPTION => 'Number of bytes (set to -1/undefined if unknown).',
self::VAR_DEFAULT_VALUE => -1,
),
self::LANGUAGE => array(
self::VAR_TYPE => mediamosa_sdk::TYPE_LANGUAGE_CODE_ISO_639_3,
self::VAR_DESCRIPTION => 'Language associated with the media item in ISO 639-3 format.',
),
self::LAST_UPDATED => array(
self::VAR_TYPE => mediamosa_sdk::TYPE_DATETIME_UTC,
self::VAR_DESCRIPTION => 'Update datetime associated with the media item - assigned by container in UTC (e.g. 2008-01-23T04:56:22Z).',
),
self::LOCATION => array(
self::VAR_TYPE => mediamosa_sdk::TYPE_STRING,
self::VAR_DESCRIPTION => 'Location corresponding to the media item.',
),
self::MIME_TYPE => array(
self::VAR_TYPE => mediamosa_sdk::TYPE_MIMETYPE,
self::VAR_DESCRIPTION => 'The MIME type of media, specified as a string.',
),
self::NUM_COMMENTS => array(
self::VAR_TYPE => mediamosa_sdk::TYPE_UINT,
self::VAR_DESCRIPTION => 'Number of comments on the media item.',
),
self::NUM_VIEWS => array(
self::VAR_TYPE => mediamosa_sdk::TYPE_UINT,
self::VAR_DESCRIPTION => 'Number of views for the media item.',
),
self::NUM_VOTES => array(
self::VAR_TYPE => mediamosa_sdk::TYPE_UINT,
self::VAR_DESCRIPTION => 'Number of votes received for voting.',
),
self::RATING => array(
self::VAR_TYPE => mediamosa_sdk::TYPE_UINT,
self::VAR_DESCRIPTION => 'Average rating of the media item on a scale of 0-10.',
self::VAR_RANGE_START => 0,
self::VAR_RANGE_END => 10,
),
self::START_TIME => array(
self::VAR_TYPE => mediamosa_sdk::TYPE_DATETIME_UTC,
self::VAR_DESCRIPTION => 'For streaming/live content, datetime when the content is available (e.g. 2008-01-23T04:56:22Z).',
),
self::TAGGED_PEOPLE => array(
self::VAR_TYPE => mediamosa_sdk::TYPE_USER_ID,
self::VAR_DESCRIPTION => 'Array of string (IDs) of people tagged in the media item.',
self::VAR_RANGE_END => mediamosa_user_db::NAME_LENGTH,
self::VAR_IS_ARRAY => self::VAR_IS_ARRAY_YES,
),
self::TAGS => array(
self::VAR_TYPE => mediamosa_sdk::TYPE_STRING,
self::VAR_DESCRIPTION => 'Tags associated with this media item.',
self::VAR_IS_ARRAY => self::VAR_IS_ARRAY_YES,
),
self::STILL_URL => array(
self::VAR_TYPE => mediamosa_sdk::TYPE_STRING,
self::VAR_DESCRIPTION => 'URL to a still image of the media item.',
),
self::TITLE => array(
self::VAR_TYPE => mediamosa_sdk::TYPE_STRING,
self::VAR_DESCRIPTION => 'Describing the media item.',
),
// This variable is "media_type" in the upload documentation, but the mediaItem description clearly said it is "type".
// References:
// http://opensocial-resources.googlecode.com/svn/spec/1.1/Core-API-Server.xml#Content-Upload
// http://opensocial-resources.googlecode.com/svn/spec/1.1/Social-Data.xml#MediaItem
self::TYPE => array(
self::VAR_TYPE => mediamosa_sdk::TYPE_ALPHA,
self::VAR_DESCRIPTION => 'The type of media, specified as a MediaItem.Type object.',
self::VAR_ALLOWED_VALUES => array(
// We don't support others, just video type.
mediamosa_rest_call::MEDIAITEM_TYPE,
),
),
self::URL => array(
self::VAR_TYPE => mediamosa_sdk::TYPE_STRING,
self::VAR_DESCRIPTION => 'Specifying the URL where the media can be found.',
),
)
);
// 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));
$app_id = reset($app_ids);
// Get params.
$user_id = $this->get_param_value(self::USER_ID);
// Standard Request Parameters.
$since = $this->get_param_value(self::REQUEST_PARAMETER_UPDATEDSINCE_VALUE);
$alt = $this->get_param_value(self::REQUEST_PARAMETER_FORMAT_VALUE);
// Call related paramters.
$asset_id = addslashes($this->get_param_value(self::ALBUM_ID));
$mediafile_id = addslashes($this->get_param_value(self::MEDIAITEM_ID));
// Data parameters.
$created = $this->get_param_value(self::CREATED);
$description = strip_tags(addslashes($this->get_param_value(self::DESCRIPTION)));
$duration = $this->get_param_value(self::DURATION);
$file_size = $this->get_param_value(self::FILE_SIZE);
$language = $this->get_param_value(self::LANGUAGE);
$last_updated = $this->get_param_value(self::LAST_UPDATED);
$location = strip_tags(addslashes($this->get_param_value(self::LOCATION)));
$mime_type = strip_tags(addslashes($this->get_param_value(self::MIME_TYPE)));
$num_comments = $this->get_param_value(self::NUM_COMMENTS);
$num_views = $this->get_param_value(self::NUM_VIEWS);
$num_votes = $this->get_param_value(self::NUM_VOTES);
$rating = $this->get_param_value(self::RATING);
$start_time = $this->get_param_value(self::START_TIME);
$tagged_people = $this->get_param_value(self::TAGGED_PEOPLE);
if ($tagged_people) {
foreach ($tagged_people as $key => $value) {
$tagged_people[$key] = strip_tags(addslashes($value));
}
}
$tags = $this->get_param_value(self::TAGS);
if ($tags) {
foreach ($tags as $key => $value) {
$tags[$key] = strip_tags(addslashes($value));
}
}
$still_url = strip_tags(addslashes($this->get_param_value(self::STILL_URL)));
$title = strip_tags(addslashes($this->get_param_value(self::TITLE)));
$type = $this->get_param_value(self::TYPE);
$url = strip_tags(addslashes($this->get_param_value(self::URL)));
// Test webservice.
mediamosa_webservice_app::webservice_must_be_active(mediamosa_webservice_app::HANDLE_MEDIA_MANAGEMENT, $app_ids);
// Must exists.
$asset = mediamosa_asset::must_exists($asset_id);
// Check owner of parent asset, need ownership.
mediamosa_acl::owner_check($app_id, $user_id, $asset[mediamosa_asset_db::APP_ID], $asset[mediamosa_asset_db::OWNER_ID]);
// Mediafile check / create.
if ($mediafile_id) {
// If we have mediafile_id, the mediafile must exists.
$mediafile = mediamosa_asset_mediafile::must_exists($mediafile_id, $app_id);
}
else {
// New mediafile.
// Set mediafile ID to something if not present.
$mediafile_id = mediamosa_db::uuid($app_id);
// Fields to insert.
$fields = array(
mediamosa_asset_mediafile_db::GROUP_ID => NULL,
mediamosa_asset_mediafile_db::IS_DOWNLOADABLE => mediamosa_asset_mediafile_db::IS_DOWNLOADABLE_FALSE,
mediamosa_asset_mediafile_db::IS_ORIGINAL_FILE => mediamosa_asset_mediafile_db::IS_ORIGINAL_FILE_TRUE,
mediamosa_asset_mediafile_db::SANNAS_MOUNT_POINT => NULL,
mediamosa_asset_mediafile_db::FILENAME => NULL,
mediamosa_asset_mediafile_db::URI => $url,
mediamosa_asset_mediafile_db::MEDIAFILE_ID_SOURCE => NULL,
mediamosa_asset_mediafile_db::TAG => $tags ? implode(', ', $tags) : '',
);
// Insert the mediafile.
$mediafile_id = mediamosa_asset_mediafile::create($mediafile_id, $app_id, $asset_id, $user_id, $fields);
}
// Create metadata.
// Metadata function call parameters.
$action = 'replace';
// Get full definitions.
$metadata_definitions_full = mediamosa_asset_metadata_property::get_metadata_properties_full();
// Mapping metadata parameters.
$params = array(
'created' => array($created),
'description' => array($description),
'language' => array($language),
'title' => array($title),
// Skipped fields, because we don't have metadata equivalients.
// $duration, $file_size, $last_updated, $location, $mime_type, $num_comments, $num_views, $num_votes, $rating, $start_time, $tagged_people, $still_url, $type,
);
// Create the metadata.
$value_set = mediamosa_asset_metadata::metadata_create($asset_id, $metadata_definitions_full, $params, $action);
// Upload file.
// The file was sent as POST data.
$video = 'video/';
$post_upload = (isset($_SERVER['RESPONSE_TYPE']) && drupal_substr($_SERVER['RESPONSE_TYPE'], 0, drupal_strlen($video)) == $video);
if ($post_upload || count($_FILES)) {
// file_size depends on method used.
if ($post_upload) {
$file_size = (int) $_SERVER['CONTENT_LENGTH'];
}
elseif (count($_FILES)) {
$file_size = 0;
foreach ($_FILES as $file) {
$file_size = $file['size'];
break;
}
}
$response['file_size'] = $file_size;
// Create job.
$is_app_admin = FALSE;
$retranscode = FALSE;
$create_still = TRUE;
$still_parameters = array(
'still_type' => mediamosa_asset_mediafile_metadata::STILL_TYPE_NONE,
'still_per_mediafile' => NULL,
'still_every_second' => NULL,
'start_frame' => NULL,
'end_frame' => NULL,
'size' => NULL,
'h_padding' => NULL,
'v_padding' => NULL,
'tag' => NULL,
'frametime' => NULL,
'width' => NULL,
'height' => NULL,
// Watermark.
'watermark_id' => NULL,
'watermark_dst_x' => NULL,
'watermark_dst_y' => NULL,
'watermark_pct' => NULL,
'watermark_v_align' => NULL,
'watermark_h_align' => NULL,
);
$job_id = mediamosa_job::create_job_upload($app_id, $asset[mediamosa_asset_db::OWNER_ID], $asset[mediamosa_asset_db::GROUP_ID], $is_app_admin, $mediafile_id, $file_size, $retranscode, $create_still, $still_parameters);
// Build the filename.
$filename = mediamosa_configuration_storage::mediafile_id_filename_get($mediafile_id);
// Create possible missing directories.
mediamosa_io::mkdir(mediamosa_io::dirname($filename));
if ($post_upload) {
// POST: file in the data.
$mime_type = $_SERVER['RESPONSE_TYPE'];
$written_bytes = mediamosa_asset_mediafile_upload::handle_upload_post($filename);
$response['written_bytes'] = $written_bytes;
$success = ($written_bytes ? TRUE : FALSE);
}
elseif (count($_FILES)) {
// POST: Multi-part.
$success = FALSE;
$mime_type = NULL;
foreach ($_FILES as $file) {
$success = move_uploaded_file($file['tmp_name'], $filename);
$mime_type = $file['type'];
// We support only one file.
// TODO Support more files.
// TODO The OpenSocial request can refer to the content being uploaded by setting the URL to "@field:<fieldname>".
// http://opensocial-resources.googlecode.com/svn/spec/1.1/Core-API-Server.xml#Content-Upload
break;
}
}
// When upload has failed, then set the upload job on 'failed'.
if (!$success) {
// Get complete job.
$job_ext = mediamosa_job::get_job_ext($job_id);
// Change status to failed.
mediamosa_job::update_status($job_ext, mediamosa_job_db::JOB_STATUS_FAILED, '1.000');
// Throw exception.
throw new mediamosa_exception_error(mediamosa_error::ERRORCODE_CANNOT_COPY_MEDIAFILE);
}
// Update the mediafile.
$fields = array(
mediamosa_asset_mediafile_db::SANNAS_MOUNT_POINT => mediamosa_configuration_storage::mount_point_get(),
mediamosa_asset_mediafile_db::FILENAME => $filename,
mediamosa_asset_mediafile_db::IS_ORIGINAL_FILE => 'TRUE',
mediamosa_asset_mediafile_db::TRANSCODE_INHERITS_ACL => mediamosa_asset_mediafile_db::TRANSCODE_INHERITS_ACL_TRUE,
);
// Don't overwrite the tag when the tag was not provided.
if (!is_null($tags)) {
$fields[mediamosa_asset_mediafile_db::TAG] = $tags;
}
// Update mediafile.
mediamosa_asset_mediafile::update($app_id, $mediafile_id, $asset[mediamosa_asset_db::OWNER_ID], $fields);
// Update the job.
mediamosa_job::update_progress_upload($job_id, $file_size);
}
// Create response.
$response['asset_id'] = $asset_id;
$response['mediafile_id'] = $mediafile_id;
// Return what has been inserted into the metadata.
foreach ($value_set as $name => $value) {
$response[$name] = $value;
}
$response['mediaitem'] = array(
'album_id' => $asset_id,
'created' => $created,
'description' => $description,
'duration' => NULL,
'file_size' => $file_size,
'id' => $mediafile_id,
'language' => $language,
'last_updated' => NULL,
'location' => NULL,
'mime_type' => $mime_type,
'num_comments' => NULL,
'num_views' => NULL,
'num_votes' => NULL,
'rating' => NULL,
'start_time' => NULL,
'tagged_people' => NULL,
'tags' => !empty($tags) ? $tags : NULL,
'still_url' => NULL,
'title' => $title,
'type' => $type,
'url' => $url,
);
$mediamosa->add_item($response);
}
}