diff options
Diffstat (limited to 'mod/videolist/start.php')
-rw-r--r-- | mod/videolist/start.php | 328 |
1 files changed, 328 insertions, 0 deletions
diff --git a/mod/videolist/start.php b/mod/videolist/start.php new file mode 100644 index 000000000..6f94b97d0 --- /dev/null +++ b/mod/videolist/start.php @@ -0,0 +1,328 @@ +<?php +/** + * Elgg Video Plugin + * This plugin allows users to create a library of videos + * + * @package Elgg + * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2 + * @author Prateek Choudhary <synapticfield@gmail.com> + * @copyright Prateek Choudhary + */ + +elgg_register_event_handler('init', 'system', 'videolist_init'); + +function videolist_init() { + + elgg_register_library('elgg:videolist', elgg_get_plugins_path() . 'videolist/lib/videolist.php'); + + // add a site navigation item + $item = new ElggMenuItem('videolist', elgg_echo('videolist'), 'videolist/all'); + elgg_register_menu_item('site', $item); + + // Extend system CSS with our own styles + elgg_extend_view('css/elgg','videolist/css'); + + // Register a page handler, so we can have nice URLs + elgg_register_page_handler('videolist', 'videolist_page_handler'); + + // Language short codes must be of the form "videolist:key" + // where key is the array key below + elgg_set_config('videolist', array( + 'video_url' => 'url', + 'title' => 'text', + 'description' => 'longtext', + 'tags' => 'tags', + 'access_id' => 'access', + )); + + // add to groups + add_group_tool_option('videolist', elgg_echo('groups:enablevideolist'), true); + elgg_extend_view('groups/tool_latest', 'videolist/group_module'); + + //add a widget + elgg_register_widget_type('videolist', elgg_echo('videolist'), elgg_echo('videolist:widget:description')); + + // Register granular notification for this type + register_notification_object('object', 'videolist_item', elgg_echo('videolist:new')); + + // Register entity type for search + elgg_register_entity_type('object', 'videolist_item'); + + // add a file link to owner blocks + elgg_register_plugin_hook_handler('register', 'menu:owner_block', 'videolist_owner_block_menu'); + elgg_register_event_handler('annotate','all','videolist_object_notifications'); + + elgg_register_plugin_hook_handler('object:notifications','object','videolist_object_notifications_intercept'); + + //register entity url handler + elgg_register_entity_url_handler('object', 'videolist_item', 'videolist_url'); + elgg_register_plugin_hook_handler('entity:icon:url', 'object', 'videolist_icon_url_override'); + + // register for embed + elgg_register_plugin_hook_handler('embed_get_sections', 'all', 'videolist_embed_get_sections'); + elgg_register_plugin_hook_handler('embed_get_items', 'videolist', 'videolist_embed_get_items'); + + // handle URLs without scheme + elgg_register_plugin_hook_handler('videolist:preprocess', 'url', 'videolist_preprocess_url'); + + // Register actions + $actions_path = elgg_get_plugins_path() . "videolist/actions/videolist"; + elgg_register_action("videolist/add", "$actions_path/add.php"); + elgg_register_action("videolist/edit", "$actions_path/edit.php"); + elgg_register_action("videolist/delete", "$actions_path/delete.php"); + + elgg_register_event_handler('upgrade', 'system', 'videolist_run_upgrades'); +} + +/** + * Dispatches blog pages. + * URLs take the form of + * All videos: videolist/all + * User's videos: videolist/owner/<username> + * Friends' videos: videolist/friends/<username> + * Video watch: videolist/watch/<guid>/<title> + * Video browse: videolist/browse + * New video: videolist/add/<guid> + * Edit video: videolist/edit/<guid> + * Group videos: videolist/group/<guid>/all + * + * Title is ignored + * + * @param array $page + * @return NULL + */ +function videolist_page_handler($page) { + + if (!isset($page[0])) { + $page[0] = 'all'; + } + + $videolist_dir = elgg_get_plugins_path() . 'videolist/pages/videolist'; + + $page_type = $page[0]; + switch ($page_type) { + case 'owner': + include "$videolist_dir/owner.php"; + break; + case 'friends': + include "$videolist_dir/friends.php"; + break; + case 'watch': + set_input('guid', $page[1]); + include "$videolist_dir/watch.php"; + break; + case 'add': + include "$videolist_dir/add.php"; + break; + case 'edit': + set_input('guid', $page[1]); + include "$videolist_dir/edit.php"; + break; + case 'group': + include "$videolist_dir/owner.php"; + break; + case 'all': + default: + include "$videolist_dir/all.php"; + break; + } + return true; +} + +/** + * Add a menu item to the user ownerblock + * + * @param string $hook + * @param string $type + * @param array $return + * @param array $params + * @return array + */ +function videolist_owner_block_menu($hook, $type, $return, $params) { + if (elgg_instanceof($params['entity'], 'user')) { + $url = "videolist/owner/{$params['entity']->username}"; + $item = new ElggMenuItem('videolist', elgg_echo('videolist'), $url); + $return[] = $item; + } else { + if ($params['entity']->videolist_enable != "no") { + $url = "videolist/group/{$params['entity']->guid}/all"; + $item = new ElggMenuItem('videolist', elgg_echo('videolist:group'), $url); + $return[] = $item; + } + } + + return $return; +} + +/** + * @param ElggObject $videolist_item + * @return string + */ +function videolist_url($videolist_item) { + $guid = $videolist_item->guid; + $title = elgg_get_friendly_title($videolist_item->title); + return elgg_get_site_url() . "videolist/watch/$guid/$title"; +} + +/** + * Event handler for videolist + * + * @param string $event + * @param string $object_type + * @param ElggObject $object + */ +function videolist_object_notifications($event, $object_type, $object) { + static $flag; + if (!isset($flag)) { + $flag = 0; + } + + if (is_callable('object_notifications')) { + if ($object instanceof ElggObject) { + if ($object->getSubtype() == 'videolist_item') { + if ($flag == 0) { + $flag = 1; + object_notifications($event, $object_type, $object); + } + } + } + } +} + +/** + * Intercepts the notification on an event of new video being created and prevents a notification from going out + * (because one will be sent on the annotation) + * + * @param string $hook + * @param string $entity_type + * @param array $returnvalue + * @param array $params + * @return bool + */ +function videolist_object_notifications_intercept($hook, $entity_type, $returnvalue, $params) { + if (isset($params)) { + if ($params['event'] == 'create' && $params['object'] instanceof ElggObject) { + if ($params['object']->getSubtype() == 'videolist_item') { + return true; + } + } + } + return null; +} + + +/** + * Register videolist as an embed type. + * + * @param string $hook + * @param string $type + * @param array $value + * @param array $params + * @return array + */ +function videolist_embed_get_sections($hook, $type, $value, $params) { + $value['videolist'] = array( + 'name' => elgg_echo('videolist'), + 'layout' => 'list', + 'icon_size' => 'medium', + ); + + return $value; +} + +/** + * Return a list of videos for embedding + * + * @param string $hook + * @param string $type + * @param array $value + * @param array $params + * @return array + */ +function videolist_embed_get_items($hook, $type, $value, $params) { + $options = array( + 'owner_guid' => elgg_get_logged_in_user_guid(), + 'type_subtype_pair' => array('object' => 'videolist_item'), + 'count' => TRUE + ); + + $count = elgg_get_entities($options); + $value['count'] += $count; + + unset($options['count']); + $options['offset'] = $params['offset']; + $options['limit'] = $params['limit']; + + $items = elgg_get_entities($options); + + $value['items'] = array_merge($items, $value['items']); + + return $value; +} + +/** + * Override the default entity icon for videoslist items + * + * @param string $hook + * @param string $type + * @param string $returnvalue + * @param array $params + * @return string Relative URL + */ +function videolist_icon_url_override($hook, $type, $returnvalue, $params) { + + // if someone already set this, quit + if ($return_value) { + return null; + } + + $videolist_item = $params['entity']; + $size = $params['size']; + + if (!elgg_instanceof($videolist_item, 'object', 'videolist_item')) { + return null; + } + + // tiny thumbnails are too small to be useful, so give a generic video icon + try { + if ($size != 'tiny' && isset($videolist_item->thumbnail)) { + $owner = $videolist_item->getOwnerEntity(); + $owner_guid = $owner->getGUID(); + $join_date = $owner->getTimeCreated(); + return "mod/videolist/thumbnail.php?joindate=$join_date&guid={$videolist_item->guid}&owner_guid=$owner_guid&size=$size"; + } + } catch (InvalidParameterException $e) { + elgg_log("Unable to get videolist icon for video with GUID {$videolist_item->guid}", 'ERROR'); + return "mod/videolist/graphics/videolist_icon_{$size}.png"; + } + if (in_array($size, array('tiny', 'small', 'medium'))){ + return "mod/videolist/graphics/videolist_icon_{$size}.png"; + } + return null; +} + +/** + * Prepend HTTP scheme if missing + * @param string $hook + * @param string $type + * @param string $returnvalue + * @param array $params + * @return string + */ +function videolist_preprocess_url($hook, $type, $returnvalue, $params) { + $parsed = parse_url($returnvalue); + if (empty($parsed['host']) && ! empty($parsed['path']) && $parsed['path'][0] !== '/') { + // user probably forgot scheme + $returnvalue = 'https://' . $returnvalue; + } + return $returnvalue; +} + +/** + * Process upgrades for the videolist plugin + */ +function videolist_run_upgrades($event, $type, $details) { + if (include_once(elgg_get_plugins_path() . 'upgrade-tools/lib/upgrade_tools.php')) { + upgrade_module_run('videolist'); + } +} |