Проблема с вставкой кода видео плеера (ненужное типографирование тегов)

добрый день!
проблема следующая:
при вставке кода видео плеера (сайт tvigle.ru) в топик происходит замена некоторых параметров тегов и тегов html кодом.

например, исходный код:
<object id="v28425_1" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="650" height="488" ><param name="wmode" value="opaque"></param>
<param name="FlashVars" value="vote=0&srv=pub.tvigle.ru&prt=606ef00364bea873c57a77c79a3a34a8&id=28425&w=650&h=488&type=&dopparam=&modes=1"></param>
<param name="allowFullScreen" value="true"></param>
<param name="movie" value="http://pub.tvigle.ru/swf/tvigle_single_v2.swf"></param>
<param name="quality" value="high"></param>
<param name="bgcolor" value="#000000"></param>
<param name="allowscriptaccess" value="always"></param>
<embed src="http://pub.tvigle.ru/swf/tvigle_single_v2.swf" allowscriptaccess="always"
quality="high" width="650" height="488" bgcolor="#000000"  
allowfullscreen="true" flashvars="vote=0&srv=pub.tvigle.ru&prt=606ef00364bea873c57a77c79a3a34a8&id=28425&w=650&h=488&type=&dopparam=&modes=1"
type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
</object>


код, который получается после обработки парсерами:
<object width="650" height="488"><param name="wmode" value="opaque"></param>
<param name="FlashVars" value="vote=0&amp;srv=pub.tvigle.ru&amp;prt=606ef00364bea873c57a77c79a3a34a8&amp;id=28425&amp;w=650&amp;h=488&amp;type=&amp;dopparam=&amp;modes=1"></param><param name="allowFullScreen" value="true"></param>
<param name="movie" value="http://pub.tvigle.ru/swf/tvigle_single_v2.swf"></param>
<param name="quality" value="high"></param><param name="bgcolor" value="#000000"></param>
<param name="allowscriptaccess" value="always"></param>
&lt;embed src=&quot;http://pub.tvigle.ru/swf/tvigle_single_v2.swf&quot; allowscriptaccess=&quot;always&quot;quality=&quot;high&quot; width=&quot;650&quot; height=&quot;488&quot; bgcolor=&quot;#000000&quot; allowfullscreen=&quot;true&quot; flashvars=&quot;vote=0&srv=pub.tvigle.ru&prt=606ef00364bea873c57a77c79a3a34a8&id=28425&w=650&h=488&type=&dopparam=&modes=1&quot;type=&quot;application/x-shockwave-flash&quot; pluginspage=&quot;http://www.macromedia.com/go/getflashplayer&quot; /&gt;</object>


как видим в теге param амперсанд (&) заменяются на
&amp;
, что делать не надо,
и весь тег embed типографируется, т.е. вместо
<embed
получается
&lt;embed

вместо
"

получаем
&quot;

и так далее в том же духе
живой пример можно посмотреть здесь — wokrug.ru/garniry/2011/04/22/kartofel-po-andaluzski.html

вводные данные:
версия LiveStreet — 0.4.2
редактор топиков — стандартный LiveStreet

что пробовал делать:
менять настройки Jevix в Text.class.php, в частности пробовал дописывать
$this->oJevix->cfgSetTagNoTypography('embed');
по сути это должно запретить Jevix типографировать тег embed, не помогло(.

p.s. все выходные читал ответы на подобные вопросы на сайте, но ничего так и не нашел, т.к. большинство сводится к хитрым манипуляциям с кодом плеера, а это для пользователя неприемлемо — пользователь должен иметь возможность взять код в одном месте и вставить его в другое место. опять же не подходят варианты написать парсер, по типу Ютюба и Вконтакте, т.к. всегда найдется очередной видео хостинг с которым будет затык при вставке плеера на сайт. Т.е. необходимо решение (изменение кода Text.class.php или Jevix.php или дополнительный модуль) которое позволяло бы вставлять код любого видео плеера в пост без искажения самого кода (пусть даже с риском для безопасности, пусть администратор сайта сам решает как ему быть — опасаться, что когда сайт достигнет посещаемости Фейсбука какой то нехороший пользователь удумает нанести вред сайту внедрение вредоносного кода, или дать пользователям без гемора устанавливать код любого плеера на сайт).

заранее всем спасибо за помощь!

23 комментария

avatar
Вот вроде вставилось без проблем:

  • ort
  • 0
avatar
если брать код с открытой части tvige.ru действительно вроде вставляется корректно, но я беру код с партнерской зона tvigle.ru — в этом коде есть дополнительные настройки.
для примера привожу код одного и того же ролика для пользователей и для партнеров (с дополнительными параметрами).
код с сайта (http://www.tvigle.ru/category/kitchen/vkusno?video=469004):
<object id="v227c85e8b0b7a2fd34bb773dafcc6ff6" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="720" height="540" align="middle"><param name="wmode" value="opaque"></param>
<param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param>
<param name="movie" value="http://photo.tvigle.ru/resource/rf/swf/22/7c/85/e8b0b7a2fd34bb773dafcc6ff6.swf"></param>
<embed src="http://photo.tvigle.ru/resource/rf/swf/22/7c/85/e8b0b7a2fd34bb773dafcc6ff6.swf" width="720" height="540"  allowfullscreen="true" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"></embed>
</object>


тот же код для с расширенными параметрами:
<object id="v28425_1" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="720" height="540" ><param name="wmode" value="opaque"></param>
<param name="FlashVars" value="vote=0&srv=pub.tvigle.ru&prt=606ef00364bea873c57a77c79a3a34a8&id=28425&w=720&h=540&type=&dopparam=&modes=1"></param>
<param name="allowFullScreen" value="true"></param>
<param name="movie" value="http://pub.tvigle.ru/swf/tvigle_single_v2.swf"></param>
<param name="quality" value="high"></param>
<param name="bgcolor" value="#000000"></param>
<param name="allowscriptaccess" value="always"></param>
<embed src="http://pub.tvigle.ru/swf/tvigle_single_v2.swf" allowscriptaccess="always"
quality="high" width="720" height="540" bgcolor="#000000"  
allowfullscreen="true" flashvars="vote=0&srv=pub.tvigle.ru&prt=606ef00364bea873c57a77c79a3a34a8&id=28425&w=720&h=540&type=&dopparam=&modes=1"
type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
</object>


и вот результат установки «партнерского» кода на сайт:

avatar
извините, не тот код вставил в ответ выше!
вот результат вставки кода плеера с расширенными параметрами:

<embed src="http://pub.tvigle.ru/swf/tvigle_single_v2.swf" allowscriptaccess="always"quality="high" width="500" height="375" bgcolor="#000000" allowfullscreen="true" flashvars="vote=0&srv=pub.tvigle.ru&prt=606ef00364bea873c57a77c79a3a34a8&id=28425&w=500&h=375&type=&dopparam=&modes=1"type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
avatar
посмотрите код страницы под этим плеером и все увидите
avatar
все выходные читал ответы на подобные вопросы на сайте, но ничего так и не нашел, т.к.
Я пару дней назад Аякси писал ответ на точно такой же вопрос.
avatar
не амперсандах дело. в Жевиксе стоит проверка на ембед и обжект как одну строку и когда в ней встречаются переносы — то не обрабатываются теги обжект и ембед как задумано, а обрабатываются как оыбчные теги и поэтому все знаки (амперсанд, скобки и т.п.) заменяются на хтмл

livestreet.ru/blog/3545.html#comment106949
avatar
спасибо за наводку, действительно читал этот пост, но не обратил внимания на самый конец.
убрал все переносы строк, в коде появился нормальный embed, но осталась проблема амперсандов — в параметрах все амперсанды заменены на хтмл.

ниже код плеера без переносов строк (смотри код страницы):

avatar
но осталась проблема амперсандов — в параметрах все амперсанды заменены на хтмл.
это не проблема. так и должно быть, в любом случае оно корректно обрабатывается
avatar
в том и проблема, что не корректно читаются FlashVars, среди прочего в ролике выше по окончании ролика не должен показываться блок «Смотрите на Tvigle.ru», а показывается он из-за того, что некорректно обрабатывается FlashVars.
avatar
я просто работал с ембед кодами, много. ни разу на практике замена & на & не была проблемой.
у вас в конце

h=488&type=&dopparam=&modes=1

type и dopparam вообще пустые. какие параметры отвечают чтобы в конце небыло «Смотрите на ...»?
avatar
в случае Твигла код без «Смотрите на ...»:
&type=&dopparam=&modes=1&next=1

с «Смотрите на ...»:
&type=&dopparam=&modes=1

т.е. за «Смотрите на ...» отвечает
&next=1
avatar
все остальные параметры работают ведь?
возможно длина строки флешварс имеет огран-е.
avatar
остальные параметры не проверял, да их и нет
при установке кода напрямую в базу — все работает на ура. тем более, что код то я не сочинил, его умные люди из Твигла написали.
каково решение проблемы с переносами строк — писать в Text.class.php парсер типа «если между object — убирать \r\n» или править Jevix.php, что бы он отлавливал object и embed не только как одну строку, в этом случае вопрос — где оно там?
avatar
остальные параметры не проверял, да их и нет
vote=0&srv=pub.tvigle.ru&prt=606ef00364bea873c57a77c79a3a34a8&id=28425&w=500&h=375&type=&dopparam=&modes=1"

есть. кстати у вас там пробела не хватает
flashvars=«vote=0&srv=pub.tvigle.ru&prt=606ef00364bea873c57a77c79a3a34a8&id=28425&w=500&h=375&type=&dopparam=&modes=1»type=«application/x-shockwave-flash»
avatar
не совсем вижу где пробела не хватает.
какие будут мысли по поводу как автоматически убирать пустые строки, что бы Jevix корректно код видео плеера распознавал? думаю все же легче в Text.class.php парсер дописывать
avatar
ужи видел несколько замечаний что лучше это выполнить в виде плагина. все \н и \р и \т убрать из текста кода.
либо попробовать ключ /m (многострочность) в регеспе парсера ембед и обжект кода в текст.класс.пхп.
avatar
ок, попробую порыться в коде. о результатах обязательно сообщу.
быструю победу не гарантирую, т.к. я Перловый программист, но с помощью общественности разберусь)
avatar
здесь я ошибся относительно ключа /m — там жевикс проверяет, а не через регекспу.
avatar
сочинил такую незамысловатую конструкцию, которую добавил в Text.class.php в начале функции FlashParamParser, перед заменой коротких embed на длинные:

if (preg_match("/^(.*)<object(.*)<\/object>(.*)$/s",$sText,$match)) {
	$text_match = str_replace("\r\n",'',$match[2]);
	$sText = $match[1] . "<object" . $text_match . "</object>" . $match[3];
}


не знаю насколько это красиво со стороны эстетов PHP, но работает)
если чего то налажал с ключами, регекспом и кодом вообще — знатоки PHP поправьте пожалуйста.

всем спасибо за помощь!
к сожалению плюсовать еще не умею — руки до кнопок не достают)
avatar
Напишите отдельный топик. Опишите проблему, задачу и ваше решение, т.к. такая проблема встречается на ЛС и тут и там и её ещё толком никто не решал.
avatar
где лучше топик создавать? в «Вопросах», в личном или еще где-то?
avatar
Куда у вас сейчас получиться. Он не потеряется.
avatar
не понял, где именно это нужно прописать? какая папка первоначальная?
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.