Скриптовый язык для полей провайдеров

Документ актуален для InstantVideo 2.X

Как мы уже знаем, при импорте по ссылке от создаваемых провайдеров в админке, поля роликов формируются посредством распарсивания исходного кода при помощи регулярных выражений. В InstantVideo2 для гибкости в этих полях заложена поддержка небольшого скриптового языка. Синтаксис его прост и легок для понимания и запоминания.

Все поля данных таких провайдеров поддерживают этот синтаксис, однако разумней всего это использовать в полях "Регулярные выражения файлов" и "Регулярное выражение для изображения". Для удобства эти поля больше остальных и писать код существенно проще.

Итак, первое, что необходимо понять - для чего нужно использовать эти языковые конструкции. Для каждого ролика сервер получает исходный текст страницы с удаленного сайта и применяет регулярные выражения полей для этого текста. Часто бывает, что искомые данные, например ссылка на файл воспроизведения, не присутствуют в основном исходном коде страницы и чтобы до нее добраться необходимо выполнить некую цепочку действий. Вот для таких цепочек и сделан этот небольшой скриптовый язык.

Итак, представим, что нам нужно получить ссылку на видео файл сайта "Pornstar Club" (да, к сожалению кроме адальт сайтов более подходящих примеров мы не нашли). Берём ссылку на любой из роликов этого сайта и открываем исходный код страницы в своём браузере. Поиск по тексту фразами " mp4" и "flv" ничего не дал, но мы заметили инициализацию плеера:

	<script>
	    jwplayer("myElement").setup({
	    	autostart: true,
	    	flashplayer: "/stxt/flash/player.swf",
	        file: "/galleries/0099/49508/jw_playlist.php",
			controlbar: {
				"position": "bottom"
			},
			streching: 'fill',
			autostart: 'true',
			repeat: 'list',
	        height: 564,
	        width: 720
	    });
	</script>

Где видим, что файл для воспроизведения берется по некой ссылке /galleries/0099/49508/jw_playlist.php. Подставляем к ней имя домена сайта и переходим по ссылке. Открыв её мы видим следующий текст:

<rss version="2.0" xmlns:media="//search.yahoo.com/mrss/" xmlns:jwplayer="//developer.longtailvideo.com/trac/wiki/FlashFormats">
<channel>
	<title></title>
		<item>
    		    <description></description>
		    <media:content url="//cdn1.adult-site/0075/42047/1.flv" type="video/x-flv" />
		    <media:thumbnail url="//adult-site/screens/0075/42047/1_1.jpg" />		    
                    <jwplayer:type>lighttpd</jwplayer:type>
		</item>
</channel>
</rss>

Где уже становится очевидным, что отсюда мы можем получить прямую ссылку на видео файл и постер картинку.

Заполняем поле "Регулярные выражения файлов" для этого провайдера.

Чтобы движок понял, что перед ним набор инструкций, в первой строке необходимо написать ключевое слово:

#function#

Выражения дальше пишутся каждое с новой строки.

В следующей строке пишем ключевое слово start, означающее начало инструкции, и через двоеточие название функции, при помощи которой нам нужно получить данные:

start:get

Функции всего две: get и cookieget, т.е. мы можем писать start:get или start:cookieget. Функция get делает запрос к сайту-донору без использования cookie, функция cookieget соответственно использует при запросе cookie.

В следующей строке необходимо написать регулярное выражение, результатом которого будет некая ссылка, по которой движок должен запросить следующие данные. С этими полученными данными мы, при необходимости, будем работать дальше. Таким образом, у нас получается цепочка: в самом начале работы у нас есть исходная страница ролика, к которой применяется регулярное выражение, после следующего запроса у нас уже другой набор текста, с которым мы работаем и так далее.

#file: "([^"]+)",#Uis

Заканчиваем инструкцию мы ключевым словом return и в следующей строке пишем выражение, как именно полученные данные нам нужно вернуть:

return
http://{domain}{result}

После строки return обязательно должно быть указано, что хотим вернуть. В этой строке применяется в основном ключевая фраза {result}, означающая результат работы регулярного выражения выше. Если необходимо его дополнить, то пишем что нам необходимо. Можно использовать ключевое слово {domain}, означающее имя домена текущего запроса. Таким образом важно понимать, что во всех таких инструкциях главным результатом действия будет некая ссылка, которую движок загрузит по цепочке. После окончания инструкции мы можем написать новую, аналогичным образом, либо сформировать исходный результат.

Если необходимо сформировать результат, то следующей строкой мы пишем ключевое слово build

build

А на следующей строке записываем результирующее регулярное выражение:

#<media:content url="([^"]+)"#Uis

Полный текст рассматриваемого примера будет выглядеть так:

#function#
start:get
#file: "([^"]+)",#Uis
return
http://{domain}{result}
build
#<media:content url="([^"]+)"#Uis

Подведем итог. На начало работы языковой конструкции у нас есть текст исходной страницы ролика с сайта-донора. В каждой из инструкций (должна быть как минимум одна) мы посредством регулярного выражения, которое применяется к уже полученному тексту, получаем некую ссылку и загружаем по ней новый исходный код и дальше уже работаем с ним, если необходимо формируя по цепочке сколько нужно инструкций. Если готовы сформировать результирующую строку, пишем слово build и в новой строке записываем окончательное регулярное выражение.