diff options
Diffstat (limited to 'mod')
48 files changed, 1962 insertions, 0 deletions
| diff --git a/mod/videolist/.gitignore b/mod/videolist/.gitignore new file mode 100644 index 000000000..339142537 --- /dev/null +++ b/mod/videolist/.gitignore @@ -0,0 +1,15 @@ +# ignore IDE/hidden/testing/OS cache files +.* +*~ +/nbproject +/nb-configuration.xml +Session.vim +*.tmproj +*.tmproject +tmtags +Thumbs.db +Desktop.ini +/JsTestDriver-*.jar + +# don't ignore travis config +!/.travis.yml diff --git a/mod/videolist/CHANGES.txt b/mod/videolist/CHANGES.txt new file mode 100644 index 000000000..9a55a443f --- /dev/null +++ b/mod/videolist/CHANGES.txt @@ -0,0 +1,14 @@ +Version 1.8.1 +(November 8, 2013 from https://github.com/lorea/videolist.git) + + Enhancements +  * Setting responsive dimensions. +  * Making video thumbnails faster (thanks to ura soul). +  * Do not display watching video in sidebar (thanks to ura soul). + + Bugfixes +  * Using https instead http in embeded videos. + +Version 1.8.0 (Foxglove) +(September 13th, 2013 from git://github.com/lorea/videolist.git) + diff --git a/mod/videolist/actions/videolist/delete.php b/mod/videolist/actions/videolist/delete.php new file mode 100644 index 000000000..0b9724c52 --- /dev/null +++ b/mod/videolist/actions/videolist/delete.php @@ -0,0 +1,39 @@ +<?php +/** +* Elgg videolist item delete +*  +* @package ElggVideolist +*/ + +$guid = (int) get_input('guid'); + +$videolist_item = get_entity($guid); +if (!$videolist_item->guid) { +	register_error(elgg_echo("videolist:deletefailed")); +	forward('videolist/all'); +} + +if (!$videolist_item->canEdit()) { +	register_error(elgg_echo("videolist:deletefailed")); +	forward($videolist_item->getURL()); +} + +$container = $videolist_item->getContainerEntity(); +$url = $videolist_item->getURL(); + +if (!$videolist_item->delete()) { +	register_error(elgg_echo("videolist:deletefailed")); +} else { +	system_message(elgg_echo("videolist:deleted")); +} + +// we can't come back to video url because it's deleted +if($url != $_SERVER['HTTP_REFERER']) { +	forward(REFERER); +} + +if (elgg_instanceof($container, 'group')) { +	forward("videolist/group/$container->guid/all"); +} else { +	forward("videolist/owner/$container->username"); +} diff --git a/mod/videolist/actions/videolist/edit.php b/mod/videolist/actions/videolist/edit.php new file mode 100644 index 000000000..a5e6ea453 --- /dev/null +++ b/mod/videolist/actions/videolist/edit.php @@ -0,0 +1,107 @@ +<?php
 +/**
 + * Create or edit a video
 + *
 + * @package ElggVideolist
 + */
 +
 +$variables = elgg_get_config('videolist');
 +$input = array();
 +foreach ($variables as $name => $type) {
 +    $filter_input = ($name !== 'video_url');
 +	$input[$name] = get_input($name, null, $filter_input);
 +	if ($name == 'title') {
 +		$input[$name] = strip_tags($input[$name]);
 +	}
 +	if ($type == 'tags') {
 +		$input[$name] = string_to_tag_array($input[$name]);
 +	}
 +}
 +
 +// Get guids
 +$video_guid = (int)get_input('video_guid');
 +$container_guid = (int)get_input('container_guid');
 +
 +elgg_make_sticky_form('videolist');
 +
 +elgg_load_library('elgg:videolist');
 +
 +// If new video, get data from video providers
 +if(!$video_guid) {
 +
 +    $input['video_url'] = elgg_trigger_plugin_hook('videolist:preprocess', 'url', $input, $input['video_url']);
 +
 +    if (!$input['video_url']) {
 +		register_error(elgg_echo('videolist:error:no_url'));
 +		forward(REFERER);
 +	}
 +
 +	$parsedPlatform = videolist_parse_url($input['video_url']);
 +
 +	if (!$parsedPlatform) {
 +		register_error(elgg_echo('videolist:error:invalid_url'));
 +		forward(REFERER);
 +	}
 +    list ($parsed, $platform) = $parsedPlatform;
 +    /* @var Videolist_PlatformInterface $platform */
 +
 +	unset($input['title']);
 +	unset($input['description']);
 +    $input = array_merge($parsed, $platform->getData($parsed), $input);
 +    $input['videotype'] = $platform->getType();
 +	
 +} else {
 +	unset($input['video_url']);
 +}
 +
 +if ($video_guid) {
 +	$video = get_entity($video_guid);
 +	if (!$video || !$video->canEdit()) {
 +		register_error(elgg_echo('videolist:error:no_save'));
 +		forward(REFERER);
 +	}
 +	$new_video = false;
 +} else {
 +	$video = new ElggObject();
 +	$video->subtype = 'videolist_item';
 +	$new_video = true;
 +}
 +
 +if (sizeof($input) > 0) {
 +	foreach ($input as $name => $value) {
 +		$video->$name = $value;
 +	}
 +}
 +
 +$video->container_guid = $container_guid;
 +
 +if ($video->save()) {
 +
 +	elgg_clear_sticky_form('videolist');
 +	
 +	// Let's save the thumbnail in the data folder
 +    $thumb_url = $video->thumbnail;
 +    if ($thumb_url) {
 +        $thumbnail = file_get_contents($thumb_url);
 +        if ($thumbnail) {
 +            $prefix = "videolist/" . $video->guid;
 +            $filehandler = new ElggFile();
 +            $filehandler->owner_guid = $video->owner_guid;
 +            $filehandler->setFilename($prefix . ".jpg");
 +            $filehandler->open("write");
 +            $filehandler->write($thumbnail);
 +            $filehandler->close();
 +        }
 +    }
 +
 +	system_message(elgg_echo('videolist:saved'));
 +
 +	if ($new_video) {
 +		add_to_river('river/object/videolist_item/create', 'create', elgg_get_logged_in_user_guid(), $video->guid);
 +	}
 +
 +	forward($video->getURL());
 +} else {
 +	register_error(elgg_echo('videolist:error:no_save'));
 +	forward(REFERER);
 +}
 diff --git a/mod/videolist/graphics/_videolist_icon_medium.png b/mod/videolist/graphics/_videolist_icon_medium.pngBinary files differ new file mode 100644 index 000000000..9cfc50fd8 --- /dev/null +++ b/mod/videolist/graphics/_videolist_icon_medium.png diff --git a/mod/videolist/graphics/videolist_icon_medium.png b/mod/videolist/graphics/videolist_icon_medium.pngBinary files differ new file mode 100644 index 000000000..e567c70ed --- /dev/null +++ b/mod/videolist/graphics/videolist_icon_medium.png diff --git a/mod/videolist/graphics/videolist_icon_small.png b/mod/videolist/graphics/videolist_icon_small.pngBinary files differ new file mode 100644 index 000000000..507260f28 --- /dev/null +++ b/mod/videolist/graphics/videolist_icon_small.png diff --git a/mod/videolist/graphics/videolist_icon_tiny.png b/mod/videolist/graphics/videolist_icon_tiny.pngBinary files differ new file mode 100644 index 000000000..2ea6e05f4 --- /dev/null +++ b/mod/videolist/graphics/videolist_icon_tiny.png diff --git a/mod/videolist/languages/ca.php b/mod/videolist/languages/ca.php new file mode 100644 index 000000000..289c1f44a --- /dev/null +++ b/mod/videolist/languages/ca.php @@ -0,0 +1,40 @@ +<?php +$language = array ( +  'videolist' => 'Vídeos', +  'videolist:owner' => 'Vídeos de %s', +  'videolist:friends' => 'Vídeos dels amics', +  'videolist:all' => 'Tots els vídeos', +  'videolist:add' => 'Afegir vídeo', +  'videolist:group' => 'Vídeos del grup', +  'groups:enablevideolist' => 'Activar vídeos del grup', +  'videolist:edit' => 'Edita aquest vídeo', +  'videolist:delete' => 'Esborra aquest vídeo', +  'videolist:new' => 'Un nou vídeo', +  'videolist:notification' => '%s ha afegit un nou vídeo + +%s +%s + +Veure i comentar al nou vídeo: +%s', +  'videolist:delete:confirm' => 'Estàs segur de voler esborrar aquest vídeo?', +  'item:object:videolist_item' => 'Vídeo', +  'videolist:nogroup' => 'Aquest grup no té cap vídeo encara', +  'videolist:more' => 'Més vídeos', +  'videolist:none' => 'No hi ha cap vídeo', +  'river:create:object:videolist_item' => '%s ha creat el vídeo %s', +  'river:update:object:videolist_item' => '% ha actualitzat el vídeo %s', +  'river:comment:object:videolist_item' => '%s ha comentat al vídeo titulat %s', +  'videolist:title' => 'Títol', +  'videolist:description' => 'Descripció', +  'videolist:video_url' => 'Escriu la URL del vídeo', +  'videolist:access_id' => 'Qui pot veure que has penjat aquest vídeo?', +  'videolist:tags' => 'Afegir etiquetes', +  'videolist:error:no_save' => 'Hi ha hagut un error desant el vídeo, si us plau intenta-ho d\'aquí a una estona', +  'videolist:saved' => 'El teu vídeo s\'ha desat correctament!', +  'videolist:deleted' => 'El teu vídeo s\'ha esborrat correctament!', +  'videolist:deletefailed' => 'Malauradament, aquest vídeo no es pot esborrar ara. Si us plau, intenta-ho més tard', +  'videolist:num_videos' => 'Nombre de vídeos a mostrar', +  'videolist:widget:description' => 'La teva llista de reproducció de vídeos.', +); +add_translation("ca", $language);
\ No newline at end of file diff --git a/mod/videolist/languages/en.php b/mod/videolist/languages/en.php new file mode 100644 index 000000000..d357725a7 --- /dev/null +++ b/mod/videolist/languages/en.php @@ -0,0 +1,78 @@ +<?php +/** + * Elgg videolist english language pack. + * + * @package ElggVideolist + */ +  +$english = array( + +	/** +	 * Menu items and titles +	 */ + +	'videolist' => "Videos", +	'videolist:owner' => "%s's videos", +	'videolist:friends' => "Friends' videos", +	'videolist:all' => "All site videos", +	'videolist:add' => "Add a video", + +	'videolist:group' => "Group videos", +	'groups:enablevideolist' => 'Enable group videos', + +	'videolist:edit' => "Edit this video", +	'videolist:delete' => "Delete this video", + +	'videolist:new' => "Add a video", +	'videolist:notification' => +'%s added a new video: + +%s +%s + +View and comment on the new video: +%s +', +	'videolist:delete:confirm' => 'Are you sure you want to delete this video?', +	'item:object:videolist_item' => 'Video', +	'videolist:nogroup' => 'This group does not have any video yet', +	'videolist:more' => 'More videos', +	'videolist:none' => 'No videos posted yet.', + +	/** +	* River +	**/ + +	'river:create:object:videolist_item' => '%s created the video %s', +	'river:update:object:videolist_item' => '%s updated the video %s', +	'river:comment:object:videolist_item' => '%s commented on the video titled %s', + +	/** +	 * Form fields +	 */ + +	'videolist:title' => 'Title', +	'videolist:description' => 'Description', +	'videolist:video_url' => 'Enter video URL', +	'videolist:access_id' => 'Who can see you posted this video?', +	'videolist:tags' => 'Add tags', + +	/** +	 * Status and error messages +	 */ +	'videolist:error:no_save' => 'There was an error in saving the video, please try after sometime', +	'videolist:saved' => 'Your video has been saved successfully!', +	'videolist:deleted' => 'Your video was removed successfully!', +	'videolist:deletefailed' => 'Unfortunately, this video could not be removed now. Please try again later', +	 + +	/** +	 * Widget +	 **/ + +	'videolist:num_videos' => 'Number of videos to display', +	'videolist:widget:description' => 'Your personal video playlist.', +	 +); + +add_translation("en", $english); diff --git a/mod/videolist/languages/es.php b/mod/videolist/languages/es.php new file mode 100644 index 000000000..ad8cbe46c --- /dev/null +++ b/mod/videolist/languages/es.php @@ -0,0 +1,40 @@ +<?php +$language = array ( +  'videolist' => 'Vídeos', +  'videolist:owner' => 'vídeos de %s', +  'videolist:friends' => 'Vídeos de amigos', +  'videolist:all' => 'Todos los vídeos', +  'videolist:add' => 'Añadir vídeo', +  'videolist:group' => 'Vídeos del grupo', +  'groups:enablevideolist' => 'Habilitar vídeos de grupo', +  'videolist:edit' => 'Editar este vídeo', +  'videolist:delete' => 'Eliminar este vídeo', +  'videolist:new' => 'Nuevo vídeo', +  'videolist:notification' => '%s ha añadido un nuevo vídeo: + +%s +%s + +Ver y comentar el nuevo vídeo: +%s', +  'videolist:delete:confirm' => 'Estas seguro de que quieres eliminar este vídeo?', +  'item:object:videolist_item' => 'Vídeo', +  'videolist:nogroup' => 'Este grupo no tiene ningún video todavía', +  'videolist:more' => 'Más videos', +  'videolist:none' => 'No hay videos colgados.', +  'river:create:object:videolist_item' => '%s ha creado el video %s', +  'river:update:object:videolist_item' => '%s ha actualizado el video %s', +  'river:comment:object:videolist_item' => '%s ha comentado en el video titulado %s', +  'videolist:title' => 'Título', +  'videolist:description' => 'Descripción', +  'videolist:video_url' => 'URL del video', +  'videolist:access_id' => 'Quien puede ver que has colgado el video?', +  'videolist:tags' => 'Añadir etiquetas', +  'videolist:error:no_save' => 'Ha habido un error guardando el video, por favor inténtalo más tarde', +  'videolist:saved' => '¡Tu video se ha guardado correctamente!', +  'videolist:deleted' => '¡Tu video se ha borrado correctamente!', +  'videolist:deletefailed' => 'Desafortunadamente este video no se puede borrar ahora. Por favor inténtalo más tarde de nuevo', +  'videolist:num_videos' => 'Número de videos a mostrar', +  'videolist:widget:description' => 'Tu lista personal de reproducción de videos.', +); +add_translation("es", $language);
\ No newline at end of file diff --git a/mod/videolist/languages/fr.php b/mod/videolist/languages/fr.php new file mode 100644 index 000000000..c21495546 --- /dev/null +++ b/mod/videolist/languages/fr.php @@ -0,0 +1,28 @@ +<?php +$fr = array ( +  'videolist' => 'Mes videos', +  'videolist:home' => '%s \'s Videos', +  'videolist:new' => 'ajouter une video', +  'videolist:find' => 'toutes les videos', +  'videolist:search' => 'toutes les videos', +  'videolist:submit' => 'envoie', +  'videolist:widget' => 'Mes videos', +  'videolist:widget:description' => 'tes videos de youtube', +  'videolist:num_videos' => 'nombre de videos à afficher', +  'profile:videoheader' => 'ma galerie video', +  'videolist:tags' => 'ajoute des tags', +  'videolist:browse' => 'cherche des videos - %s', +  'videolist:browsemenu' => 'cherche des videos', +  'videolist:title_search_tube' => 'cherche des videos de', +  'videolist:searchTubeVideos' => 'cherche sur youtube.com', +  'videolist:comments' => 'commentaires', +  'videolist:commentspost' => 'poste', +  'videolist:river:item' => 'une video', +  'videolist:river:created' => '%s a ajouté', +  'videolist:group' => 'Videos', +  'videolist:groupall' => 'toutes les vidoes du groupe', +  'videolist:none' => 'ce groupe n\'as pas encore de videos', +); + +add_translation("fr", $fr); + diff --git a/mod/videolist/languages/gl.php b/mod/videolist/languages/gl.php new file mode 100644 index 000000000..90444e3fa --- /dev/null +++ b/mod/videolist/languages/gl.php @@ -0,0 +1,29 @@ +<?php +$gl = array ( +  'videolist' => 'Os meus vídeos', +  'videolist:home' => 'Vídeos de %s', +  'videolist:new' => 'Engadir vídeos', +  'videolist:find' => 'Vídeos de toda a rede', +  'videolist:search' => 'Procurar vídeos', +  'videolist:submit' => 'Aceptar', +  'videolist:widget' => 'Os meus vídeos', +  'videolist:widget:description' => 'Podes comparti-la túa galería de vídeos personalizada co resto da rede', +  'videolist:num_videos' => 'Número de vídeos a mostrar', +  'profile:videoheader' => 'As miñas galerías de vídeos', +  'videolist:tags' => 'Engadir etiquetas', +  'videolist:browse' => 'Procura-los vídeos de %s', +  'videolist:browsemenu' => 'Procurar vídeos', +  'videolist:title_search_tube' => 'Procurar vídeos en:', +  'videolist:searchTubeVideos' => 'Procurar en youtube', +  'videolist:comments' => 'Comentarios', +  'videolist:commentspost' => 'Entrada', +  'videolist:river:item' => 'un vídeo titulado:', +  'videolist:river:created' => '%s engadiu', +  'videolist:group' => 'Vídeos do grupo', +  'videolist:groupall' => 'Tódolos vídeos do grupo', +  'videolist:none' => 'O non hai vídeos subidos.', +  'videolist:edit' => 'Editar vídeo %s', +); + +add_translation("gl", $gl); + diff --git a/mod/videolist/languages/pt.php b/mod/videolist/languages/pt.php new file mode 100644 index 000000000..e8b28c182 --- /dev/null +++ b/mod/videolist/languages/pt.php @@ -0,0 +1,50 @@ +<?php +$pt = array ( +  'videolist' => 'Meus vídeos', +  'videolist:home' => 'Vídeos de %s', +  'videolist:new' => 'Adicionar vídeo', +  'videolist:find' => 'Todos os vídeos', +  'videolist:search' => 'Todos os vídeos', +  'videolist:submit' => 'Publicar', +  'videolist:widget' => 'Meus Vídeos', +  'videolist:num_videos' => 'Número de visto a visualizar', +  'profile:videoheader' => 'Minha galeria de vídeos', +  'videolist:tags' => 'Adicionar etiquetas', +  'videolist:browse' => 'Procurar vídeos - %s', +  'videolist:browsemenu' => 'Procurar vídeos', +  'videolist:title_search_tube' => 'Procurar vídeos de', +  'videolist:searchTubeVideos' => 'Procurar no youtube', +  'videolist:comments' => 'Comentários', +  'videolist:commentspost' => 'Publicar', +  'videolist:river:item' => 'um video', +  'videolist:river:created' => 'adicionado por %s', +  'videolist:group' => 'Vídeos', +  'videolist:groupall' => 'Todos os vídeos do grupo', +  'videolist:none' => 'Este grupo ainda não tem vídeos', +  'videolist:user' => 'Vídeos de %s', +  'videolist:all' => 'Todos vídeos', +  'videolist:add' => 'Adicionar um vídeo', +  'videolist:play:video' => 'Tocar', +  'videolist:add:video' => 'Adicionar', +  'videolist:friends' => 'Vídeos dos amigos', +  'videolist:edit' => 'Editar vídeos', +  'videolist:ingroup' => 'na comunidade', +  'videolist:title' => 'Título', +  'videolist:description' => 'Descrição', +  'videolist:video_url' => 'Entrar um endereço do vídeo', +  'videolist:error:no_save' => 'Ocorreu um erro ao salvar o vídeo, por favor tente mais tarde', +  'videolist:saved' => 'Seu vídeo foi salvo com sucesso!', +  'videolist_item:more' => 'Ver todos vídeos', +  'videolist_item:none' => 'desculpe, nenhum vídeo foi encontrado', +  'videolist:deleted' => 'Seu vídeo foi removido com sucesso!', +  'videolist:deletefailed' => 'Infelizmente, este vídeo não pode ser removido agora. Por favor, tente mais tarde.', +  'videolist:widget:description' => 'Demonstre sua galeira de vídeos pessoas do youtube', +  'videolist:access_id' => 'Quem pode ver que você enviou este vídeo?', +  'item:object:videolist_item' => 'Vídeos', +  'river:create:object:videolist_item' => '%s adicionou o vídeo %s', +  'river:comment:object:videolist_item' => '%s comentou em %s', +  'videolist:delete:confirm' => 'Você tem certeza que deseja apagar este vídeo?', +); + +add_translation("pt", $pt); + diff --git a/mod/videolist/lib/Videolist/Platform/Bliptv.php b/mod/videolist/lib/Videolist/Platform/Bliptv.php new file mode 100644 index 000000000..62cefbd39 --- /dev/null +++ b/mod/videolist/lib/Videolist/Platform/Bliptv.php @@ -0,0 +1,38 @@ +<?php + +class Videolist_Platform_Bliptv implements Videolist_PlatformInterface +{ +    public function getType() +    { +        return "bliptv"; +    } + +    public function parseUrl($url) +    { +        $parsed = parse_url($url); +        $path = explode('/', $parsed['path']); + +        if ($parsed['host'] != 'blip.tv' || count($path) < 3) { +            return false; +        } + +        return array( +            'video_id' => $parsed['path'], +        ); +    } + +    public function getData($parsed) +    { +        $video_id = $parsed['video_id']; + +        $buffer = file_get_contents('https://blip.tv'.$video_id.'?skin=rss'); +        $xml = new SimpleXMLElement($buffer); + +        return array( +            'title' => current($xml->xpath('/rss/channel/item/title')), +            'description' => strip_tags(current($xml->xpath('/rss/channel/item/description'))), +            'thumbnail' => current($xml->xpath('/rss/channel/item/media:thumbnail/@url')), +            'embedurl' => current($xml->xpath('/rss/channel/item/blip:embedUrl')), +        ); +    } +} diff --git a/mod/videolist/lib/Videolist/Platform/Gisstv.php b/mod/videolist/lib/Videolist/Platform/Gisstv.php new file mode 100644 index 000000000..b79898449 --- /dev/null +++ b/mod/videolist/lib/Videolist/Platform/Gisstv.php @@ -0,0 +1,50 @@ +<?php + +class Videolist_Platform_Gisstv implements Videolist_PlatformInterface +{ +    public function getType() +    { +        return "gisstv"; +    } + +    public function parseUrl($url) +    { +        $parsed = parse_url($url); +        $path = explode('/', $parsed['path']); + +        if ($parsed['host'] != 'giss.tv' || $path[1] != 'dmmdb') { +            return false; +        } + +        if($path[2] == 'contents' && isset($path[3])) { +            $video_id = $path[3]; +        } elseif($path[3] == 'contents' && isset($path[4])) { +            $video_id = $path[4]; +        } else { +            return false; +        } + +        return array( +            'video_id' => $video_id, +        ); +    } + +    public function getData($parsed) +    { +        $video_id = $parsed['video_id']; + +        $buffer = file_get_contents('http://giss.tv/dmmdb//rss.php'); +        $xml = new SimpleXMLElement($buffer); + +        $data = array(); +        foreach($xml->xpath('/rss/channel/item') as $item){ +            if ($item->link === 'http://giss.tv/dmmdb//contents/'.$video_id) { +                $data['title'] = $item->title; +                $data['description'] = strip_tags($item->description); +                $data['thumbnail'] = $item->thumbnail; +                break; +            } +        } +        return $data; +    } +} diff --git a/mod/videolist/lib/Videolist/Platform/Metacafe.php b/mod/videolist/lib/Videolist/Platform/Metacafe.php new file mode 100644 index 000000000..74a346b34 --- /dev/null +++ b/mod/videolist/lib/Videolist/Platform/Metacafe.php @@ -0,0 +1,38 @@ +<?php + +class Videolist_Platform_Metacafe implements Videolist_PlatformInterface +{ +    public function getType() +    { +        return "metacafe"; +    } + +    public function parseUrl($url) +    { +        $parsed = parse_url($url); +        $path = explode('/', $parsed['path']); + +        if ($parsed['host'] != 'www.metacafe.com' || $path[1] != 'watch' || !(int) $path[2]) { +            return false; +        } + +        return array( +            'video_id' => $path[2], +        ); +    } + +    public function getData($parsed) +    { +        $video_id = $parsed['video_id']; + +        $buffer = file_get_contents("https://www.metacafe.com/api/item/$video_id"); +        $xml = new SimpleXMLElement($buffer); + +        return array( +            'title' => current($xml->xpath('/rss/channel/item/title')), +            'description' => strip_tags(current($xml->xpath('/rss/channel/item/description'))), +            'thumbnail' => current($xml->xpath('/rss/channel/item/media:thumbnail/@url')), +            'embedurl' => current($xml->xpath('/rss/channel/item/media:content/@url')), +        ); +    } +} diff --git a/mod/videolist/lib/Videolist/Platform/Vimeo.php b/mod/videolist/lib/Videolist/Platform/Vimeo.php new file mode 100644 index 000000000..6930cdb2d --- /dev/null +++ b/mod/videolist/lib/Videolist/Platform/Vimeo.php @@ -0,0 +1,40 @@ +<?php + +class Videolist_Platform_Vimeo implements Videolist_PlatformInterface +{ +    public function getType() +    { +        return "vimeo"; +    } + +    public function parseUrl($url) +    { +        $parsed = parse_url($url); +        $path = explode('/', $parsed['path']); + +        if ($parsed['host'] != 'vimeo.com' || !(int) $path[1]) { +            return false; +        } + +        return array( +            'video_id' => $path[1], +        ); +    } + +    public function getData($parsed) +    { +        $video_id = $parsed['video_id']; + +        $buffer = file_get_contents("https://vimeo.com/api/v2/video/$video_id.xml"); +        $xml = new SimpleXMLElement($buffer); + +        $videos = $xml->children(); +        $video = $videos[0]; + +        return array( +            'title' => $video->title, +            'description' => strip_tags($video->description), +            'thumbnail' => $video->thumbnail_medium, +        ); +    } +} diff --git a/mod/videolist/lib/Videolist/Platform/Youtube.php b/mod/videolist/lib/Videolist/Platform/Youtube.php new file mode 100644 index 000000000..31a4bc950 --- /dev/null +++ b/mod/videolist/lib/Videolist/Platform/Youtube.php @@ -0,0 +1,49 @@ +<?php + +class Videolist_Platform_Youtube implements Videolist_PlatformInterface +{ +    public function getType() +    { +        return "youtube"; +    } + +    public function parseUrl($url) +    { +        $parsed = parse_url($url); +        $id = ''; +        if (! empty($parsed['host'])) { +            if ($parsed['host'] === 'youtu.be') { +                // short URLs +                $id = substr($parsed['path'], 1); +            } elseif ($parsed['host'] === 'www.youtube.com' +                    && $parsed['path'] === '/watch' +                    && ! empty($parsed['query'])) { +                // long URLs +                parse_str($parsed['query'], $query); +                if (! empty($query['v'])) { +                    $id = $query['v']; +                } +            } +        } +        if ($id) { +            return array( +                'video_id' => $id, +            ); +        } +        return false; +    } + +    public function getData($parsed) +    { +        $video_id = $parsed['video_id']; + +        $buffer = file_get_contents('https://gdata.youtube.com/feeds/api/videos/'.$video_id); +        $xml = new SimpleXMLElement($buffer); + +        return array( +            'title' => $xml->title, +            'description' => strip_tags($xml->content), +            'thumbnail' => "https://img.youtube.com/vi/$video_id/default.jpg", +        ); +    } +} diff --git a/mod/videolist/lib/Videolist/PlatformInterface.php b/mod/videolist/lib/Videolist/PlatformInterface.php new file mode 100644 index 000000000..25ca019e9 --- /dev/null +++ b/mod/videolist/lib/Videolist/PlatformInterface.php @@ -0,0 +1,23 @@ +<?php + +interface Videolist_PlatformInterface { +    /** +     * @abstract +     * @return string +     */ +    public function getType(); + +    /** +     * @abstract +     * @param string $url +     * @return array +     */ +    public function parseUrl($url); + +    /** +     * @abstract +     * @param array $parsed +     * @return array +     */ +    public function getData($parsed); +} diff --git a/mod/videolist/lib/videolist.php b/mod/videolist/lib/videolist.php new file mode 100644 index 000000000..b86db99cf --- /dev/null +++ b/mod/videolist/lib/videolist.php @@ -0,0 +1,46 @@ +<?php + +/** + * @return array + */ +function videolist_get_default_platforms() { +    static $platforms = array(); +    if (! $platforms) { +        require dirname(__FILE__) . '/Videolist/PlatformInterface.php'; +        $path = dirname(__FILE__) . '/Videolist/Platform'; +        foreach (scandir($path) as $filename) { +            if (preg_match('/^(\\w+)\\.php$/', $filename, $m)) { +                require "$path/$filename"; +                $class = 'Videolist_Platform_' . $m[1]; +                $platform = new $class(); +                if ($platform instanceof Videolist_PlatformInterface) { +                    /* @var Videolist_PlatformInterface $platform */ +                    $platforms[$platform->getType()][] = $platform; +                } +            } +        } +    } +    return $platforms; +} + +/** + * @param string $url + * @return array [parsed, platform] + */ +function videolist_parse_url($url) { +    $params = array( +        'url' => $url, +    ); +    $platforms = videolist_get_default_platforms(); +	$platforms = elgg_trigger_plugin_hook('videolist:prepare', 'platforms', $params, $platforms); +    foreach ($platforms as $list) { +        foreach ($list as $platform) { +            /* @var Videolist_PlatformInterface $platform */ +            $parsed = $platform->parseUrl($url); +            if ($parsed) { +                return array($parsed, $platform); +            } +        } +    } +	return false; +} diff --git a/mod/videolist/manifest.xml b/mod/videolist/manifest.xml new file mode 100644 index 000000000..08539650a --- /dev/null +++ b/mod/videolist/manifest.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="UTF-8"?> +<plugin_manifest xmlns="http://www.elgg.org/plugin_manifest/1.8"> +	<name>Videolist</name> +	<author>Prateek Choudhary, Core developers, Lorea developers</author> +	<version>1.8.1</version> +	<category>lorea</category> +	<category>content</category> +	<category>multimedia</category> +	<description>This plugin allows users to create a library of videos.</description> +	<website>https://lorea.org/</website> +	<copyright>(C) Prateek Choudhary 2008-09, Elgg 2010, Lorea 2011-13</copyright> +	<license>GNU Public License version 2</license> +	<requires> +		<type>elgg_release</type> +		<version>1.8</version> +	</requires> +	<activate_on_install>true</activate_on_install> +</plugin_manifest> diff --git a/mod/videolist/pages/videolist/add.php b/mod/videolist/pages/videolist/add.php new file mode 100644 index 000000000..6dd6a2f1f --- /dev/null +++ b/mod/videolist/pages/videolist/add.php @@ -0,0 +1,39 @@ +<?php +/** + * Add a new video + * + * @package ElggVideolist + */ + +$page_owner = elgg_get_page_owner_entity(); + +gatekeeper(); +group_gatekeeper(); + +$title = elgg_echo('videolist:add'); + +// set up breadcrumbs +elgg_push_breadcrumb(elgg_echo('videolist'), "file/all"); +if (elgg_instanceof($page_owner, 'user')) { +	elgg_push_breadcrumb($page_owner->name, "videolist/owner/$page_owner->username"); +} else { +	elgg_push_breadcrumb($page_owner->name, "videolist/group/$page_owner->guid/all"); +} +elgg_push_breadcrumb($title); + +// create form +$form_vars = array(); +$body_vars = array( +	'container_guid' => $page_owner->guid, +	'access_id' => elgg_instanceof($page_owner, 'user') ? ACCESS_DEFAULT : $page_owner->group_acl, +); + +$content = elgg_view_form('videolist/edit', $form_vars, $body_vars); + +$body = elgg_view_layout('content', array( +	'content' => $content, +	'title' => $title, +	'filter' => '', +)); + +echo elgg_view_page($title, $body); diff --git a/mod/videolist/pages/videolist/all.php b/mod/videolist/pages/videolist/all.php new file mode 100644 index 000000000..6fe68f3eb --- /dev/null +++ b/mod/videolist/pages/videolist/all.php @@ -0,0 +1,34 @@ +<?php +/** + * All videos + * + * @package ElggVideolist + */ + +elgg_push_breadcrumb(elgg_echo('videolist')); + +elgg_register_title_button(); + +$limit = get_input("limit", 10); + +$title = elgg_echo('videolist:all'); + +$content = elgg_list_entities(array( +	'types' => 'object', +	'subtypes' => 'videolist_item', +	'limit' => $limit, +	'full_view' => FALSE +)); + +$sidebar = elgg_view('videolist/sidebar'); + +elgg_set_context('videolist'); +$body = elgg_view_layout('content', array( +	'filter_context' => 'all', +	'content' => $content, +	'title' => $title, +	'sidebar' => $sidebar, +)); + +// Finally draw the page +echo elgg_view_page($title, $body); diff --git a/mod/videolist/pages/videolist/edit.php b/mod/videolist/pages/videolist/edit.php new file mode 100644 index 000000000..916d9d280 --- /dev/null +++ b/mod/videolist/pages/videolist/edit.php @@ -0,0 +1,49 @@ +<?php +/** + * Edit a videolist item + * + * @package ElggVideolist + */ + +gatekeeper(); + +$guid = (int) get_input('guid'); +$videolist_item = get_entity($guid); +if (!$videolist_item) { +	forward(); +} +if (!$videolist_item->canEdit()) { +	forward(); +} + +$title = elgg_echo('videolist:edit'); +$container = get_entity($videolist_item->getContainerGUID()); + +elgg_push_breadcrumb(elgg_echo('videolist'), "videolist/all"); +if(elgg_instanceof($container, 'user')){ +	elgg_push_breadcrumb($container->name, "videolist/owner/$container->username/"); +} else { +	elgg_push_breadcrumb($container->name, "videolist/group/$container->guid/"); +} +elgg_push_breadcrumb($videolist_item->title, $videolist_item->getURL()); +elgg_push_breadcrumb($title); + +elgg_set_page_owner_guid($container->guid); + +$form_vars = array(); +$body_vars = array('guid' => $guid); + +foreach(array_keys(elgg_get_config('videolist')) as $variable) { +	$body_vars[$variable] = $videolist_item->$variable; +} +$body_vars['container_guid'] = $videolist_item->container_guid; + +$content = elgg_view_form('videolist/edit', $form_vars, $body_vars); + +$body = elgg_view_layout('content', array( +	'content' => $content, +	'title' => $title, +	'filter' => '', +)); + +echo elgg_view_page($title, $body); diff --git a/mod/videolist/pages/videolist/friends.php b/mod/videolist/pages/videolist/friends.php new file mode 100644 index 000000000..8bbb34698 --- /dev/null +++ b/mod/videolist/pages/videolist/friends.php @@ -0,0 +1,33 @@ +<?php +/** + * Friends Videolist + * + * @package ElggVideolist + */ + +$page_owner = elgg_get_page_owner_entity(); + +elgg_push_breadcrumb(elgg_echo('videolist'), "videolist/all"); +elgg_push_breadcrumb($page_owner->name, "videolist/owner/$page_owner->username"); +elgg_push_breadcrumb(elgg_echo('friends')); + +elgg_register_title_button(); + +$title = elgg_echo("videolist:friends"); + +// offset is grabbed in list_user_friends_objects +$content = list_user_friends_objects($page_owner->guid, 'videolist_items', 10, false); +if (!$content) { +	$content = elgg_echo("videolist:none"); +} + +$sidebar = elgg_view('videolist/sidebar', array()); + +$body = elgg_view_layout('content', array( +	'filter_context' => 'friends', +	'content' => $content, +	'title' => $title, +	'sidebar' => $sidebar, +)); + +echo elgg_view_page($title, $body); diff --git a/mod/videolist/pages/videolist/owner.php b/mod/videolist/pages/videolist/owner.php new file mode 100644 index 000000000..74917354e --- /dev/null +++ b/mod/videolist/pages/videolist/owner.php @@ -0,0 +1,54 @@ +<?php +/** + * Individual's or group's videolist + * + * @package ElggVideolist + */ + +// access check for closed groups +group_gatekeeper(); + +$page_owner = elgg_get_page_owner_entity(); + +elgg_push_breadcrumb(elgg_echo('videolist'), "videolist/all"); +elgg_push_breadcrumb($page_owner->name); + +elgg_register_title_button(); + +$params = array(); + +if ($page_owner->guid == elgg_get_logged_in_user_guid()) { +	// user looking at own videolist +	$params['filter_context'] = 'mine'; +} else if (elgg_instanceof($page_owner, 'user')) { +	// someone else's videolist +	// do not show select a tab when viewing someone else's posts +	$params['filter_context'] = 'none'; +} else { +	// group videolist +	$params['filter'] = ''; +} + +$title = elgg_echo("videolist:owner", array($page_owner->name)); + +// List videolist +$content = elgg_list_entities(array( +	'types' => 'object', +	'subtypes' => 'videolist_item', +	'container_guid' => $page_owner->guid, +	'limit' => 10, +	'full_view' => FALSE, +)); +if (!$content) { +	$content = elgg_echo("videolist:none"); +} + +$sidebar = elgg_view('videolist/sidebar'); + +$params['content'] = $content; +$params['title'] = $title; +$params['sidebar'] = $sidebar; + +$body = elgg_view_layout('content', $params); + +echo elgg_view_page($title, $body); diff --git a/mod/videolist/pages/videolist/watch.php b/mod/videolist/pages/videolist/watch.php new file mode 100644 index 000000000..3a740f396 --- /dev/null +++ b/mod/videolist/pages/videolist/watch.php @@ -0,0 +1,42 @@ +<?php +/** + * View a file + * + * @package ElggFile + */ + +$videolist_item = get_entity(get_input('guid')); + +elgg_set_page_owner_guid($videolist_item->container_guid); + +$page_owner = elgg_get_page_owner_entity(); + +elgg_push_breadcrumb(elgg_echo('videolist'), 'videolist/all'); + +$crumbs_title = $page_owner->name; +if (elgg_instanceof($page_owner, 'group')) { +	elgg_push_breadcrumb($crumbs_title, "videolist/group/$page_owner->guid/all"); +} else { +	elgg_push_breadcrumb($crumbs_title, "videolist/owner/$page_owner->username"); +} + +$title = $videolist_item->title; + +elgg_push_breadcrumb($title); + +$content = elgg_view_entity($videolist_item, array('full_view' => true)); +$content .= elgg_view_comments($videolist_item); + +$sidebar = elgg_view('videolist/sidebar', array( +	'show_comments' => false, +	'show_videolist' => true, +)); + +$body = elgg_view_layout('content', array( +	'content' => $content, +	'title' => $title, +	'filter' => '', +	'sidebar' => $sidebar, +)); + +echo elgg_view_page($title, $body); 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'); +	} +} diff --git a/mod/videolist/thumbnail.php b/mod/videolist/thumbnail.php new file mode 100644 index 000000000..7a4ca8b6c --- /dev/null +++ b/mod/videolist/thumbnail.php @@ -0,0 +1,64 @@ +<?php +/** + * Elgg profile icon cache/bypass + *  + *  + * @package ElggProfile + */ + +// Get DB settings +require_once(dirname(dirname(dirname(__FILE__))). '/engine/settings.php'); + +global $CONFIG; + +// won't be able to serve anything if no joindate or guid +if (!isset($_GET['joindate']) || !isset($_GET['guid'])) { +	header("HTTP/1.1 404 Not Found"); +	exit; +} + +$join_date = (int)$_GET['joindate']; +$owner_guid = (int)$_GET['owner_guid']; +$guid = (int)$_GET['guid']; + +$mysql_dblink = @mysql_connect($CONFIG->dbhost, $CONFIG->dbuser, $CONFIG->dbpass, true); +if ($mysql_dblink) { +	if (@mysql_select_db($CONFIG->dbname, $mysql_dblink)) { +		$result = mysql_query("select name, value from {$CONFIG->dbprefix}datalists where name='dataroot'", $mysql_dblink); +		if ($result) { +			$row = mysql_fetch_object($result); +			while ($row) { +				if ($row->name == 'dataroot') { +					$data_root = $row->value; +				} +				$row = mysql_fetch_object($result); +			} +		} + +		@mysql_close($mysql_dblink); + +		if (isset($data_root)) { + +			// this depends on ElggDiskFilestore::makeFileMatrix() +			$user_path = date('Y/m/d/', $join_date) . $owner_guid; + +			$filename = "$data_root$user_path/videolist/{$guid}.jpg"; +			$size = @filesize($filename); +			if ($size) { +				header("Content-type: image/jpeg"); +				header('Expires: ' . gmdate('D, d M Y H:i:s \G\M\T', strtotime("+6 months")), true); +				header("Pragma: public"); +				header("Cache-Control: public"); +				header("Content-Length: $size"); +				readfile($filename); +				exit; +			} +		} +	} + +} + +// something went wrong so load engine and try to forward to default icon +require_once(dirname(dirname(dirname(__FILE__))) . "/engine/start.php"); +elgg_log("Profile icon direct failed.", "WARNING"); +forward("mod/videolist/graphics/videolist_icon_{$size}.png"); diff --git a/mod/videolist/upgrades/2012022501.php b/mod/videolist/upgrades/2012022501.php new file mode 100644 index 000000000..f832c8033 --- /dev/null +++ b/mod/videolist/upgrades/2012022501.php @@ -0,0 +1,82 @@ +<?php +/** + * Download the video thumbnail in the server and link it to video + * + * First determine if the upgrade is needed and then if needed, batch the update + */ + +$items = elgg_get_entities(array( +	'type' => 'object', +	'subtype' => 'videolist', +	'limit' => 5, +	'order_by' => 'e.time_created asc', +)); + +// if not items, no upgrade required +if (!$items) { +	return; +} + +/** + * Downloads the thumbnail and saves into data folder + * + * @param ElggObject $item + * @return bool + */ +function videolist_2012022501($item) { +	require_once(elgg_get_plugins_path() . 'upgrade-tools/lib/upgrade_tools.php'); + +	// get thumbnail image +	$thumbnail = file_get_contents($item->thumbnail); +	if (!$thumbnail) { +		return false; +	} +	 +	$prefix = "videolist/" . $item->guid; +	$filehandler = new ElggFile(); +	$filehandler->owner_guid = $item->owner_guid; +	$filehandler->setFilename($prefix . ".jpg"); +	$filehandler->open("write"); +	$filehandler->write($thumbnail); +	$filehandler->close(); +	 +	// update properties +	if ($item->url) { +		$item->video_url = $item->url; +		$item->deleteMetadata('url'); +	} +	if ($item->desc) { +		$item->description = $item->desc; +		$item->deleteMetadata('desc'); +		$item->save(); +	} +	if ($item->embedurl) { +		$item->deleteMetadata('embedurl'); +	} +	upgrade_change_subtype($item, 'videolist_item'); + +	// update river +	$options = array('object_guid' => $item->guid); +	$river_items = elgg_get_river($options); +	foreach($river_items as $river_item) { +		if ($river_item->action_type == 'create') { +			upgrade_update_river($river_item->id, 'river/object/videolist_item/create', $item->guid, 0); +		} +	} + +	return true; +} +$previous_access = elgg_set_ignore_access(true); +$options = array( +	'type' => 'object', +	'subtype' => 'videolist', +	'limit' => 0, +); +$batch = new ElggBatch('elgg_get_entities', $options, 'videolist_2012022501', 100); +elgg_set_ignore_access($previous_access); + +if ($batch->callbackResult) { +	error_log("Elgg videolist upgrade (2012022501) succeeded"); +} else { +	error_log("Elgg videolist upgrade (2012022501) failed"); +} diff --git a/mod/videolist/views/default/forms/videolist/edit.php b/mod/videolist/views/default/forms/videolist/edit.php new file mode 100644 index 000000000..18fb6ded4 --- /dev/null +++ b/mod/videolist/views/default/forms/videolist/edit.php @@ -0,0 +1,55 @@ +<?php +/** + * Videolist edit form body + * + * @package ElggVideolist + */ + +$variables = elgg_get_config('videolist'); + +if(empty($vars['guid'])){ +	unset($variables['title']); +	unset($variables['description']); +} else { +	unset($variables['video_url']); +} + +foreach ($variables as $name => $type) { +?> +<div> +	<label><?php echo elgg_echo("videolist:$name") ?></label> +	<?php +		if ($type != 'longtext') { +			echo '<br />'; +		} +	?> +	<?php echo elgg_view("input/$type", array( +			'name' => $name, +			'value' => $vars[$name], +		)); +	?> +</div> +<?php +} + +$cats = elgg_view('categories', $vars); +if (!empty($cats)) { +	echo $cats; +} + + +echo '<div class="elgg-foot">'; +if ($vars['guid']) { +	echo elgg_view('input/hidden', array( +		'name' => 'video_guid', +		'value' => $vars['guid'], +	)); +} +echo elgg_view('input/hidden', array( +	'name' => 'container_guid', +	'value' => $vars['container_guid'], +)); + +echo elgg_view('input/submit', array('value' => elgg_echo('save'))); + +echo '</div>'; diff --git a/mod/videolist/views/default/icon/object/videolist_item.php b/mod/videolist/views/default/icon/object/videolist_item.php new file mode 100644 index 000000000..24a5b5fe8 --- /dev/null +++ b/mod/videolist/views/default/icon/object/videolist_item.php @@ -0,0 +1,47 @@ +<?php +/** + * Generic icon view. + * + * @package Elgg + * @subpackage Core + * + * @uses $vars['entity'] The entity the icon represents - uses getIconURL() method + * @uses $vars['size']   topbar, tiny, small, medium (default), large, master + * @uses $vars['href']   Optional override for link + */ + +$entity = $vars['entity']; +/* @var ElggObject $entity */ + +$sizes = array('small', 'medium', 'large', 'tiny', 'master', 'topbar'); +$img_width = array('tiny' => 25, 'small' => 40, 'medium' => 100, 'large' => 200); + +// Get size +if (!in_array($vars['size'], $sizes)) { +	$size = "medium"; +} else { +	$size = $vars['size']; +} + +if (isset($entity->name)) { +	$title = $entity->name; +} else { +	$title = $entity->title; +} + +$url = $entity->getURL(); +if (isset($vars['href'])) { +	$url = $vars['href']; +} + +$img_src = $entity->getIconURL($vars['size']); +$img = "<img src=\"$img_src\" alt=\"$title\" width=\"{$img_width[$size]}\" />"; + +if ($url) { +	echo elgg_view('output/url', array( +		'href' => $url, +		'text' => $img, +	)); +} else { +	echo $img; +} diff --git a/mod/videolist/views/default/object/videolist_item.php b/mod/videolist/views/default/object/videolist_item.php new file mode 100644 index 000000000..5789c8475 --- /dev/null +++ b/mod/videolist/views/default/object/videolist_item.php @@ -0,0 +1,108 @@ +<?php +/** + * Videolist item renderer. + * + * @package ElggVideolist + */ + +$full = elgg_extract('full_view', $vars, FALSE); +$entity = elgg_extract('entity', $vars, FALSE); +/* @var ElggObject $entity */ + +if (!$entity) { +	return TRUE; +} + +$owner = $entity->getOwnerEntity(); +$container = $entity->getContainerEntity(); +$categories = elgg_view('output/categories', $vars); +$excerpt = elgg_get_excerpt($entity->description); + +$body = elgg_view('output/longtext', array('value' => $entity->description)); + +$owner_link = elgg_view('output/url', array( +	'href' => "videolist/owner/$owner->username", +	'text' => $owner->name, +)); +$author_text = elgg_echo('byline', array($owner_link)); + +$entity_icon = elgg_view_entity_icon($entity, 'medium'); +$owner_icon = elgg_view_entity_icon($owner, 'small'); + +$tags = elgg_view('output/tags', array('tags' => $entity->tags)); +$date = elgg_view_friendly_time($entity->time_created); + +$comments_count = $entity->countComments(); +//only display if there are commments +if ($comments_count != 0) { +	$text = elgg_echo("comments") . " ($comments_count)"; +	$comments_link = elgg_view('output/url', array( +		'href' => $entity->getURL() . '#videolist-item-comments', +		'text' => $text, +	)); +} else { +	$comments_link = ''; +} + +$metadata = elgg_view_menu('entity', array( +	'entity' => $vars['entity'], +	'handler' => 'videolist', +	'sort_by' => 'priority', +	'class' => 'elgg-menu-hz', +)); + +$subtitle = "$author_text $date $categories $comments_link"; + +// do not show the metadata and controls in widget view +if (elgg_in_context('widgets')) { +	$metadata = ''; +	$excerpt = ''; +} + +if ($full && !elgg_in_context('gallery')) { + +	$content = elgg_view("videolist/watch", $vars); +	$content = "<div class=\"videolist-watch\">$content</div>"; + +	$params = array( +		'entity' => $entity, +		'title' => false, +		'content' => $content, +		'metadata' => $metadata, +		'subtitle' => $subtitle, +		'tags' => $tags, +	); +	$params = $params + $vars; +	$list_body = elgg_view('object/elements/summary', $params); + +	$entity_info = elgg_view_image_block($owner_icon, $list_body); + +	echo <<<HTML +$entity_info +$body +HTML; + +} elseif (elgg_in_context('gallery')) { +	echo '<div class="videolist-gallery-item">'; +	$content = elgg_view('output/url', array( +		'text' => elgg_get_excerpt($entity->title, 25), +		'href' => $entity->getURL(), +	)); +	$content .= "<p class='subtitle'>$owner_link $date</p>"; +	echo elgg_view_image_block($entity_icon, $content); +	echo '</div>'; +} else { +	// brief view + +	$params = array( +		'entity' => $entity, +		'metadata' => $metadata, +		'subtitle' => $subtitle, +		'tags' => $tags, +		'content' => $excerpt, +	); +	$params = $params + $vars; +	$list_body = elgg_view('object/elements/summary', $params); + +	echo elgg_view_image_block($entity_icon, $list_body); +} diff --git a/mod/videolist/views/default/page/elements/videolist_block.php b/mod/videolist/views/default/page/elements/videolist_block.php new file mode 100644 index 000000000..a0653a09e --- /dev/null +++ b/mod/videolist/views/default/page/elements/videolist_block.php @@ -0,0 +1,36 @@ +<?php +/** + * Display the latest videolist items + * + * Generally used in a sidebar. + * + * @uses $vars['container_guid'] The videolist container + * @uses $vars['limit']          The number of comments to display + */ + +$entity_guid = get_input('guid', ELGG_ENTITIES_ANY_VALUE); +$container_guid = elgg_extract('container_guid', $vars, ELGG_ENTITIES_ANY_VALUE); + +$container = get_entity($container_guid); + +$options = array( +	'container_guid' => $container_guid, +	'limit' => elgg_extract('limit', $vars, 6), +	'type' => 'object', +	'subtypes' => 'videolist_item', +	'full_view' => false, +	'pagination' => false, +    'wheres' => array('guid <> ' . $entity_guid), // exclude this item from list. +); + +if($container) { +	$title = elgg_echo('videolist:owner', array($container->name)); +} else { +	$title = elgg_echo('videolist'); +} + +elgg_push_context('gallery'); +$content = elgg_list_entities($options); +elgg_pop_context('gallery'); + +echo elgg_view_module('aside', $title, $content); diff --git a/mod/videolist/views/default/river/object/videolist_item/create.php b/mod/videolist/views/default/river/object/videolist_item/create.php new file mode 100644 index 000000000..ea9f8394b --- /dev/null +++ b/mod/videolist/views/default/river/object/videolist_item/create.php @@ -0,0 +1,15 @@ +<?php +/** + * Videolist item river view. + */ + +$object = $vars['item']->getObjectEntity(); +$thumbnail = elgg_view('icon/object/videolist_item', array( +	'entity' => $object, +	'size' => 'medium', +)); + +echo elgg_view('river/item', array( +	'item' => $vars['item'], +	'message' => $thumbnail, +)); diff --git a/mod/videolist/views/default/videolist/css.php b/mod/videolist/views/default/videolist/css.php new file mode 100644 index 000000000..625935451 --- /dev/null +++ b/mod/videolist/views/default/videolist/css.php @@ -0,0 +1,23 @@ +<?php +/** + * Elgg Videolist CSS + */ +?> + +.videolist-watch { +    margin-top: 40px; +    position: relative; +    padding-bottom: 56.25%; +    padding-top: 30px; +    height: 0; +} +  +.videolist-watch iframe, +.videolist-watch object, +.videolist-watch embed { +    position: absolute; +    top: 0; +    left: 0; +    width: 100%; +    height: 100%; +}
\ No newline at end of file diff --git a/mod/videolist/views/default/videolist/group_module.php b/mod/videolist/views/default/videolist/group_module.php new file mode 100644 index 000000000..0e0a1ab63 --- /dev/null +++ b/mod/videolist/views/default/videolist/group_module.php @@ -0,0 +1,43 @@ +<?php +/** + * Group videolist module + */ + +$group = elgg_get_page_owner_entity(); + +if ($group->videolist_enable == "no") { +	return true; +} + +$all_link = elgg_view('output/url', array( +	'href' => "videolist/group/$group->guid/all", +	'text' => elgg_echo('link:view:all'), +)); + +elgg_push_context('widgets'); +$options = array( +	'type' => 'object', +	'subtype' => 'videolist_item', +	'container_guid' => elgg_get_page_owner_guid(), +	'limit' => 6, +	'full_view' => false, +	'pagination' => false, +); +$content = elgg_list_entities($options); +elgg_pop_context(); + +if (!$content) { +	$content = '<p>' . elgg_echo('videolist:none') . '</p>'; +} + +$new_link = elgg_view('output/url', array( +	'href' => "videolist/add/$group->guid", +	'text' => elgg_echo('videolist:add'), +)); + +echo elgg_view('groups/profile/module', array( +	'title' => elgg_echo('videolist:group'), +	'content' => $content, +	'all_link' => $all_link, +	'add_link' => $new_link, +)); diff --git a/mod/videolist/views/default/videolist/sidebar.php b/mod/videolist/views/default/videolist/sidebar.php new file mode 100644 index 000000000..4a9e1cdda --- /dev/null +++ b/mod/videolist/views/default/videolist/sidebar.php @@ -0,0 +1,28 @@ +<?php +/** + * Videolist sidebar + */ + +$show_comments = elgg_extract('show_comments', $vars, true); +$show_tags = elgg_extract('show_tags', $vars, true); +$show_videolist = elgg_extract('show_videolist', $vars, false); + +if($show_videolist){ +	echo elgg_view('page/elements/videolist_block', array( +		'container_guid' => elgg_get_page_owner_guid(), +	)); +} + +if($show_comments) { +	echo elgg_view('page/elements/comments_block', array( +		'subtypes' => 'videolist_item', +		'owner_guid' => elgg_get_page_owner_guid(), +	)); +} + +if($show_tags) { +	echo elgg_view('page/elements/tagcloud_block', array( +		'subtypes' => 'videolist_item', +		'owner_guid' => elgg_get_page_owner_guid(), +	)); +} diff --git a/mod/videolist/views/default/videolist/watch.php b/mod/videolist/views/default/videolist/watch.php new file mode 100644 index 000000000..2e1dbacec --- /dev/null +++ b/mod/videolist/views/default/videolist/watch.php @@ -0,0 +1,8 @@ +<?php + +$entity = elgg_extract('entity', $vars); +if (elgg_view_exists("videolist/watch/$entity->videotype")) { +	echo elgg_view("videolist/watch/$entity->videotype", $vars); +} else { +	echo elgg_view("videolist/watch/default", $vars); +} diff --git a/mod/videolist/views/default/videolist/watch/bliptv.php b/mod/videolist/views/default/videolist/watch/bliptv.php new file mode 100644 index 000000000..ae3d75901 --- /dev/null +++ b/mod/videolist/views/default/videolist/watch/bliptv.php @@ -0,0 +1,6 @@ +<?php + +$embedurl = $vars['entity']->embedurl; +$embedurl = preg_replace('/https?:/', 'https:', $embedurl); + +echo "<iframe src=\"$embedurl\" frameborder=\"0\" allowfullscreen></iframe>"; diff --git a/mod/videolist/views/default/videolist/watch/gisstv.php b/mod/videolist/views/default/videolist/watch/gisstv.php new file mode 100644 index 000000000..a96894ada --- /dev/null +++ b/mod/videolist/views/default/videolist/watch/gisstv.php @@ -0,0 +1,7 @@ +<?php + +$video_id = $vars['entity']->video_id; + +echo "<video controls=\"\" tabindex=\"0\"> +	<source type=\"video/ogg\" src=\"http://giss.tv/dmmdb//contents/$video_id\"></source> +</video>"; diff --git a/mod/videolist/views/default/videolist/watch/metacafe.php b/mod/videolist/views/default/videolist/watch/metacafe.php new file mode 100644 index 000000000..ce8e257d5 --- /dev/null +++ b/mod/videolist/views/default/videolist/watch/metacafe.php @@ -0,0 +1,6 @@ +<?php + +$embedurl = $vars['entity']->embedurl; +$embedurl = preg_replace('/https?:/', 'https:', $embedurl); + +echo "<embed flashVars=\"playerVars=autoPlay=no\" src=\"$embedurl\" wmode=\"transparent\" allowFullScreen=\"true\" allowScriptAccess=\"always\" name=\"Metacafe_$video_id\" pluginspage=\"http://www.macromedia.com/go/getflashplayer\" type=\"application/x-shockwave-flash\"></embed>"; diff --git a/mod/videolist/views/default/videolist/watch/vimeo.php b/mod/videolist/views/default/videolist/watch/vimeo.php new file mode 100644 index 000000000..cdb4b6bfb --- /dev/null +++ b/mod/videolist/views/default/videolist/watch/vimeo.php @@ -0,0 +1,5 @@ +<?php + +$video_id = $vars['entity']->video_id; + +echo "<iframe src=\"https://player.vimeo.com/video/$video_id?byline=0\" frameborder=\"0\" webkitAllowFullScreen allowFullScreen></iframe>"; diff --git a/mod/videolist/views/default/videolist/watch/youtube.php b/mod/videolist/views/default/videolist/watch/youtube.php new file mode 100644 index 000000000..b0b758718 --- /dev/null +++ b/mod/videolist/views/default/videolist/watch/youtube.php @@ -0,0 +1,5 @@ +<?php + +$video_id = $vars['entity']->video_id; + +echo "<iframe src=\"https://www.youtube-nocookie.com/embed/$video_id\" frameborder=\"0\" allowfullscreen></iframe>"; diff --git a/mod/videolist/views/default/widgets/videolist/content.php b/mod/videolist/views/default/widgets/videolist/content.php new file mode 100644 index 000000000..aaf6076a3 --- /dev/null +++ b/mod/videolist/views/default/widgets/videolist/content.php @@ -0,0 +1,32 @@ +<?php +/** + * Elgg video list widget + * + * @package ElggVideolist + */ + +$num = (int) $vars['entity']->videos_num; + +$options = array( +	'type' => 'object', +	'subtype' => 'videolist_item', +	'container_guid' => $vars['entity']->owner_guid, +	'limit' => $num, +	'full_view' => FALSE, +	'pagination' => FALSE, +); +$content = elgg_list_entities($options); + +echo $content; + +if ($content) { +	$url = "pages/owner/" . elgg_get_page_owner_entity()->username; +	$more_link = elgg_view('output/url', array( +		'href' => $url, +		'text' => elgg_echo('videolist:more'), +		'is_trusted' => true, +	)); +	echo "<span class=\"elgg-widget-more\">$more_link</span>"; +} else { +	echo elgg_echo('videolist:none'); +} diff --git a/mod/videolist/views/default/widgets/videolist/edit.php b/mod/videolist/views/default/widgets/videolist/edit.php new file mode 100644 index 000000000..a2865848e --- /dev/null +++ b/mod/videolist/views/default/widgets/videolist/edit.php @@ -0,0 +1,24 @@ +<?php +/** + * Elgg video list widget edit + * + * @package ElggVideolist + */ + +// set default value +if (!isset($vars['entity']->videos_num)) { +	$vars['entity']->videos_num = 4; +} + +$params = array( +	'name' => 'params[videos_num]', +	'value' => $vars['entity']->videos_num, +	'options' => array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), +); +$dropdown = elgg_view('input/dropdown', $params); + +?> +<div> +	<?php echo elgg_echo('videolist:num_videos'); ?>: +	<?php echo $dropdown; ?> +</div> diff --git a/mod/videolist/views/rss/object/videolist_item.php b/mod/videolist/views/rss/object/videolist_item.php new file mode 100644 index 000000000..41d89fadf --- /dev/null +++ b/mod/videolist/views/rss/object/videolist_item.php @@ -0,0 +1,47 @@ +<?php +/** + * Elgg default object view + * + * @package Elgg + * @subpackage Core + */ + +$title = $vars['entity']->title; +if (empty($title)) { +	$subtitle = strip_tags($vars['entity']->description); +	$title = substr($subtitle, 0, 32); +	if (strlen($subtitle) > 32) { +		$title .= ' ...'; +	} +} + +set_input('view', 'default'); + +$description = elgg_view("videolist/watch/".$vars['entity']->videotype, array( +	'entity' => $vars['entity'], +)); + +set_input('view', 'rss'); + +$description .= $vars['entity']->description; + +$permalink = htmlspecialchars($vars['entity']->getURL()); +$pubdate = date('r', $vars['entity']->time_created); + +$creator = elgg_view('object/creator', $vars); +$georss = elgg_view('object/georss', $vars); +$extension = elgg_view('extensions/item', $vars); + +$item = <<<__HTML +<item> +	<guid isPermaLink="true">$permalink</guid> +	<pubDate>$pubdate</pubDate> +	<link>$permalink</link> +	<title><![CDATA[$title]]></title> +	<description><![CDATA[$description]]></description> +	$creator$georss$extension +</item> + +__HTML; + +echo $item; | 
