Автозамена ссылок на видео Youtube на код ролика + плеер Uppod или модальное окно

+19
4.67K
Автоматическое преобразование ссылки на видео с ютуба, которая вставлена в посте блога, на стене, на форуме в плеер с этим видео.
Также рассмотрим вывод этого видеоролика в своем стилизованном плеере на базе Uppod плеера и вывод этого ролика в модальном окне используя имеющийся в коробке Инстанта Colorbox.

0. Бэкап файлов.
1. includes/bbcode/bbcode.lib.php
в функции autoLink

Это

  1. $search = array(
  2. "~(\s|^)((?:http|https|ftp)://[^<\s]+[^<\.,:;?!\"»'+\-\s])~uim",
  3. "~(\s|^)(www\.[^<\s]+[^<\.,:;?!\"»'+\-\s])~uim",
  4. "'([^\w\d-\.]|^)([\w\d-\.]+@[\w\d-\.]+\.[\w]+[^.,;\s<\"\'\)]+)'usi"
  5. );
  6. $replace = array(
  7. '$1<a href="/redirect?url=$2">$2</a>',
  8. '$1<a href="/redirect?url=http://$2">$2</a>',
  9. '$1<a href="mailto:$2">$2</a>'
  10. );
Заменил на это

  1. $search = array(
  2. "/\s*[a-zA-Z\/\/:\.]*youtu(be.com\/watch\?v=|.be\/)([a-zA-Z0-9\-_]+)([a-zA-Z0-9\/\*\-\_\?\&\;\%\=\.]*)/i",
  3. "~(\s|^)((?:http|https|ftp)://[^<\s]+[^<\.,:;?!\"»'+\-\s])~uim",
  4. "~(\s|^)(www\.[^<\s]+[^<\.,:;?!\"»'+\-\s])~uim",
  5. "'([^\w\d-\.]|^)([\w\d-\.]+@[\w\d-\.]+\.[\w]+[^.,;\s<\"\'\)]+)'usi"
  6.  
  7. );
  8. $replace = array(
  9. '<youtube>$2</youtube>',
  10. '$1<a href="/redirect?url=$2">$2</a>',
  11. '$1<a href="/redirect?url=http://$2">$2</a>',
  12. '$1<a href="mailto:$2">$2</a>'
  13.  
  14. );
Можно было бы конечно сразу здесь же заменять ссылку на полный код видеоролика с ютуба. Но я решил на этом этапе извлекать только Идентификатор видеоролика и в базу вместе с постом записывать только его обрамляя тегом <youtube></youtube>

Это оставляет больше возможностей для маневра на будущее. Например можно будет менять в любое время во врех роликах стандартный плеер Ютуб на свой, размер плеера, ну и если на самом Ютубе что то изменится, идентификатор ролика всё равно останется тот же скорее всего. Поэтому в базу пишется только ИД видео, а дальше придется в каждом компоненте описывать преобразование ИД ролика в плеер.

На примере стены пользователя я сделал это так:

2. core/classes/user.class.php

после
  1. while($record = $inDB->fetch_assoc($result)){
  2. $record['is_today'] = time() - strtotime($record['pubdate']) < 86400;
  3. $record['fpubdate'] = $record['is_today'] ? cmsCore::dateDiffNow($record['pubdate']) : cmsCore::dateFormat($record['pubdate']);
  4. $record['avatar'] = cmsUser::getUserAvatarUrl($record['author_id'], 'small', $record['imageurl'], $record['is_deleted']);
а) вставил это
  1.  
  2. $record['content'] = preg_replace('|<youtube>(.*)</youtube>|isU', '<iframe width="560" height="315" src="https://www.youtube.com/embed/$1" frame allowfullscreen></iframe>', $record['content']);
для вывода плеера ютуб в его стандартном виде

******

б) или это

  1. $record['content'] = preg_replace('|<youtube>(.*)</youtube>|isU', ' <a class="iframe cboxElement" href="https://www.youtube.com/embed/$1"><img src="/images/play_video.png" style="width:300px; height:auto;" /></a>', $record['content']);
для вывода вместо плеера картинки иконки, при нажатии на которую видео откроется в Colorbox

******

в) или это

  1. $record['content'] = preg_replace('|<youtube>(.*)</youtube>|isU', '<div class="player" id="$1"></div><script type="text/javascript">this.player = new Uppod({m:"video",uid:"$1",file:"https://www.youtube.com/embed/$1"});</script>', $record['content']);

для вывода видео в html5 плеере от uppod uppod.ru/help/html5

******

г) а если плеер будет со своим и стилями то вот так
  1.  
  2. $record['content'] = preg_replace('|<youtube>(.*)</youtube>|isU', '<div class="player" id="$1"></div><script type="text/javascript">this.player = new Uppod({m:"video",uid:"$1",file:"https://www.youtube.com/embed/$1",st:"uppodvideo"});</script>', $record['content']);
******


core/classes/blog.class.php
после

  1. $post['content_html'] = preg_replace('/\[(cut=)\s*(.*?)\]/ui', '', $post['content_html']);
вставить

  1. $post['content_html'] = preg_replace('|<youtube>(.*)</youtube>|isU', '<div class="player" id="$1"></div><script type="text/javascript">this.player = new Uppod({m:"video",uid:"$1",file:"https://www.youtube.com/embed/$1",st:"uppodvideo"});</script>', $post['content_html']);
(это в плеере Uppod со своими стилями, другие примеры выше)


При этом для uppod в <head> секцию сайта нужно добавить js вызова плеера Uppod и js вызова стилей для плеера Uppod (если они используются). О подключении стилей Uppod html5 читайте здесь uppod.ru/help/q=styles-html5


Действия из пункта 2 придется повторить для блогов, комментов, форума.

Вот что получается

Ссылка вставленная на стену превратилась в плеер

Иллюстрация


Оно же но с использованием Uppod

Иллюстрация

Вместо ссылки картинка со ссылкой на видео.

Иллюстрация

по клику на картинку открывается видео в колорбоксе.

Иллюстрация



P.S. в файле стилей можно задать стиль для блока <youtube>
например скрыть там где еще не работает преобразование или вывести там фон с текстом что видео скоро появится)

body youtube{
display:none;
}

P.P.S — если после этого внедрения нужно в посте опубликовать ссылку на видео что бы она осталась в виде ссылке, это можно сделать через bbcode тег url. Не проверял, но по идее там ссылки не будут заменяться на плеер.

Пока всё. Кто хочет дополнить, улучшить, вэлкам.
0
letsgo letsgo 9 лет назад #
Отличное решение.
0
Erwin Erwin 9 лет назад #
Радует что первая ветка жива и такие хорошие поправки делаете. Их прям нужно в коробку вносить сразу.
0
surfixx surfixx 9 лет назад #
Спасибо за это решение. Поставил плюс. Но есть недостаток, нет резиновости (извиняюсь за каламбур). Я решил это так: в user.class.php добавил диви

Код PHP:
  1. $record['content'] = preg_replace('|<youtube>(.*)</youtube>|isU', '[b]<div class="videoframe"><div class="videocontainer">[/b]<iframe width="560" height="315" src="https://www.youtube.com/embed/$1" frameborder="0" allowfullscreen></iframe>[b]</div></div>[/b]', $record['content']);
И в стилях добавил вот это.
Код PHP:
  1. .videoframe {
  2. display:block;
  3. max-width:560px;
  4. margin:0px auto;
  5. float:none
  6. }
  7. .videocontainer {
  8. display:block;
  9. position: relative;
  10. padding-bottom: 56.25%;
  11. padding-top: 30px;
  12. height: 0;
  13. overflow: hidden;
  14. }
  15. .videocontainer iframe,
  16. .videocontainer object,
  17. .videocontainer embed {
  18. position: absolute;
  19. top: 0;
  20. left: 0;
  21. width: 100%;
  22. height: 100%;
  23. }
Ваш <youtube></youtube> в скрипте чтото не нашол. Пришлось делать по простому.
Нил™ Нил™ 9 лет назад #
Комментарий удален
Нил™ Нил™ 9 лет назад #
Комментарий удален
0
surfixx surfixx 9 лет назад #
Спасибо за ответ. Хорошее решение, но по мне, много действий в скриптах. Всё это в плагин - вот Би да. Всё равно спас за ваш труд. Молодец.
0
sibroy sibroy 7 лет назад #
Как бы сделать такой вывод в комментариях?
Нил™ Нил™ 7 лет назад #
Комментарий удален
Нил™ Нил™ 7 лет назад #
Комментарий удален
0
sibroy sibroy 7 лет назад #
Работает...спасибо
0
sibroy sibroy 6 лет назад #
На instantcms1.10.7 в модуле Записи блогов режет тег <youtube>... что можно сделать?
Нил™ Нил™ 6 лет назад #
Комментарий удален
Нил™ Нил™ 6 лет назад #
Комментарий удален
0
sibroy sibroy 6 лет назад #
Модуль стандартный...пользуюсь вашим способом с тегом <youtube> уже больше года...вставленных роликов в блоги и комментарии порядочно) Новый способ работает...спасибо)
Нил™ Нил™ 5 лет назад #
Комментарий удален
Нил™ Нил™ 5 лет назад #
Комментарий удален
0
sibroy sibroy 4 года назад #

Вот код модуля mod_blogs

<?php<br-->/******************************************************************************/
// //
// InstantCMS v1.10.6 //
// www.instantcms.ru/ //
// //
// written by InstantCMS Team, 2007-2015 //
// produced by InstantSoft, (www.instantsoft.ru) //
// //
// LICENSED BY GNU/GPL v2 //
// //
/******************************************************************************/

function mod_blogs($mod, $cfg){

$inDB = cmsDatabase::getInstance();

$default_cfg = array (
'sort' => 'pubdate',
'owner' => 'user',
'shownum' => 5,
'minrate' => 0,
'blog_id' => 0,
'showrss' => 1
);
$cfg = array_merge($default_cfg, $cfg);

cmsCore::loadClass('blog');
$inBlog = cmsBlogs::getInstance();
$inBlog->owner = $cfg['owner'];

if($cfg['owner'] == 'club'){
cmsCore::loadModel('clubs');
$model = new cms_model_clubs();
$inDB->addSelect('b.user_id as bloglink');
} else {
cmsCore::loadModel('blogs');
$model = new cms_model_blogs();
}

// получаем аватары владельцев
$inDB->addSelect('up.imageurl, img.fileurl');
$inDB->addJoin('LEFT JOIN cms_user_profiles up ON up.user_id = u.id');
$inDB->addJoin(«LEFT JOIN cms_upload_images img ON img.target_id = p.id AND img.target = 'blog_post' AND img.component = 'blogs'»);

$inBlog->whereOnlyPublic();

if($cfg['minrate']){
$inBlog->ratingGreaterThan($cfg['minrate']);
}

if($cfg['blog_id']){
$inBlog->whereBlogIs($cfg['blog_id']);
}

$inDB->orderBy('p.'.$cfg['sort'], 'DESC')->groupBy('p.id');
$inDB->limit($cfg['shownum']);

$posts = $inBlog->getPosts(false, $model);
if(!$posts){ return false; }

cmsPage::initTemplate('modules', $cfg['tpl'])->
assign('posts', $posts)->
assign('cfg', $cfg)->
display($cfg['tpl']);

return true;

}

куда нужно вставить Ваш код 

Нил™ Нил™ 4 года назад #
Комментарий удален
Нил™ Нил™ 4 года назад #
Комментарий удален
Нил™ Нил™ 4 года назад #
Комментарий удален
Нил™ Нил™ 4 года назад #
Комментарий удален
0
sibroy sibroy 4 года назад #

Спасибо за ответ… будем пробовать

sibroy sibroy 4 года назад #
Комментарий удален

Еще от автора

Капча на сайт или разделы сайта
Если нужно, закрыть весь сайт или некоторые его разделы каптчей.
Пинг поисковых систем для первой ветки
Небольшая интеграция инструментов для пингования, чтобы сделать его чуть удобнее
Генератор карты сайта в формате txt на лету без крона
Вообще то где то тут уже есть вполне рабочие генераторы карты для первой ветки, но этот вариант тоже имеет право быть.
🍪Мы используем файлы cookie для работы сайта. Читать подробнее.