<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Неофициальный форум DLNA Home Media Server &mdash; Как добавить поиск себе в подкаст]]></title>
	<link rel="self" href="https://hms.lostcut.net/extern.php?action=feed&amp;tid=441&amp;type=atom" />
	<updated>2017-08-14T18:17:14Z</updated>
	<generator>PunBB</generator>
	<id>https://hms.lostcut.net/viewtopic.php?id=441</id>
		<entry>
			<title type="html"><![CDATA[Как добавить поиск себе в подкаст]]></title>
			<link rel="alternate" href="https://hms.lostcut.net/viewtopic.php?pid=9717#p9717" />
			<content type="html"><![CDATA[<p><span class="bbu"><strong>Организация поиска в подкасте.</strong></span></p><p>Тут я расскажу, как в свой (или не свой) подкаст можно добавить динамическую папку &quot;Поиск&quot; и сделать так, чтобы он (этот поиск) работал.</p><p>Для начала, можно установить обработку &quot;Создать ПОИСК&quot; вот <a href="https://hms.lostcut.net/viewtopic.php?pid=6293#p6293">отсюда</a>.<br />После чего в программе должна появиться одноимённая кнопка на панели программы справа.</p><p>Данной кнопкой можно воспользоваться, чтобы создать динамическую папку &quot;Поиск&quot; в корневой папке вашего подкаста, который содержит другие разделы.<br />Для этого нужно встать на саму папку в программе и нажать на эту кнопку &quot;Создать ПОИСК&quot;. После чего будет загружен скрипт динамической папки с оф. форума<br />вот из этого сообщения: <a href="http://homemediaserver.ru/forum/viewtopic.php?f=15&amp;t=2793&amp;p=17395#p17395">http://homemediaserver.ru/forum/viewtop … 395#p17395</a><br />(это сделано для того, чтобы можно было загрузить актуальный скрипт, если он там будет доработан и обновлён)<br />Там же есть небольшое описание что и как, но примеры уже устарели и не актуальны. Поэтому более подробно и на примере я объясню как с этим работать здесь.</p><p>По-умолчанию, в этом скрипте используются подсказки от гугла, при наборе символов с устройства (заход и выход и папок букв набирается текст поиска и выполняется запросы для получения подсказок по части набранного слова или слов).<br />Поэтому, если мы собираемся использовать такой поиск в подкасте для конкретного ресурса, желательно использовать подсказки тех названий, которые есть именно на данном ресурсе. Т.е. использовать нужно запросы для поиска непосредственно к ресурсу.</p><p>В любом случае, для того, чтобы работал поиск в подкасте, нужно сначала определить, как именно происходит сам поиск на сайте, для которого мы делаем поиск.<br />Тут я покажу, как это можно определить и отредактировать скрипт поиска и подкаста.</p><p>Итак, нам нужно следовать следующим этапам:<br />1) Добавить папку &quot;Поиск&quot; в корневую папку подкаста.<br />2) Найти на сайте, для которого мы делаем поиск как именно делается запрос для поиска.<br />3) Отредактировать динамический скрипт поиска для подсказок с самого сайта.<br />4) Отредактировать, добавить команды обслуживания поиска и создания элементов в самом подкасте, для обновления раздела с набранным текстом, чтобы выполнить поиск по названию и создать ссылки на найденные элементы.</p><p>С первым пунктом всё просто и я уже описал как это можно сделать. Поэтому продолжаем со второго пункта.</p><p><span class="bbu"><strong>Определяем, как происходят запросы поиска на сайте.</strong></span><br />На примере сайта topcinema.tv посмотрим, как происходит у них поиск.</p><p>Открываем в браузере сайт, находим поле поиска, заходим в инструменты разработчика на вкладку Network (сеть), чтобы видеть все запросы, которые у нас будут происходить, после факта нашего поиска на сайте.<br />Вписываем какое-либо слово в поле для поиска на самом сайте и нажимаем Enter.<br />В инструментах разработчика среди всех запросов ищем тот, который отвечает именно за поиск и смотрим в каком формате получается ответ.</p><p>Для нас важно следующее:<br />- по какому адресу (пути) идёт запрос для поиска;<br />- как закодировано название набранного текста, в UTF-8 или просто в Windows кодировке (определяем по длине кодированного текста);<br />- каким методом идёт HTTP запрос (POST или GET);<br />- нужны ли специальные HTTP заголовки для такого запроса (Origin и т.п.);<br />- в каком виде получаем ответ, в html так же как и основной список видео на сайте или в каком-нибудь формате json (например для ajax запросов).</p><p>Например, на сайте topcinema.tv мы можем определить, что запрос на поиск слова &quot;Война&quot; будет такой:<br />view-source:https://topcinema.tv/search/video/?q=%D0%92%D0%BE%D0%B9%D0%BD%D0%B0<br />Также видно, что запрос идёт GET и кодировка в текста в обычной UTF-8.<br />Тут всё оказалось довольно просто.</p><p><span class="bbu"><strong>Редактирование динамического скрипта поиска для подсказок с самого сайта.</strong></span></p><p>Теперь можно подправить текст динамической папки &quot;Набрать текст&quot;, чтобы подсказки прилетали именно от нам нужного сайта.<br />Встаём на папку &quot;Набрать текст&quot; и нажимаем Alt+5, попадаем в динамический скрипт. Там нас интересуют только эти строки:<br /></p><div class="codebox"><pre><code>char gsSuggestQuery    = &#039;http://www.google.ru/complete/search?sclient=psy-ab&amp;q=&#039;;
char gsSuggestResultCut= &#039;&#039;;
char gsSuggestRegExpr  = &#039;\\[&quot;(.*?)&quot;,&#039;;
char gsSuggestMethod   = &#039;GET&#039;;
int  gnSuggestNoUTFEnc = 0;</code></pre></div><p>Где переменной <br />gsSuggestQuery - нужно присвоить путь запроса без самого значения текста поиска (он к нему будет добавляться);<br />gsSuggestResultCut - регулярное выражение для обрезки нужного блока в ответе, в котором будут происходить поиск нужных слов (необязательно);<br />gsSuggestRegExpr - регулярное выражение для поиска названия для подсказки (лишние теги в названии будут отброшены);<br />gsSuggestMethod - метод HTTP запроса (GET или POST);<br />gnSuggestNoUTFEnc - если нужно не переводить в UTF кодировку искомый текст, то можно установить в значение 1.</p><p>Итак, для подсказок с topcinema.tv можно установить эти значения в следующий вид:<br /></p><div class="codebox"><pre><code>char gsSuggestQuery    = &#039;https://topcinema.tv/search/video/?q=&#039;;
char gsSuggestResultCut= &#039;&#039;;
char gsSuggestRegExpr  = &#039;itemprop=&quot;name&quot;&gt;Сериал(.*?)смотреть&#039;;
char gsSuggestMethod   = &#039;GET&#039;;
int  gnSuggestNoUTFEnc = 0;</code></pre></div><p>Тут самое главное в gsSuggestRegExpr - какая именно регулярка там должна стоять - только на усмотрение кодера и в зависимости от формата ответа. В ответе на поиск смотрим код html страницы (по ctrl+u) и смотрим, откуда бы нам выдрать искомые названия. В данном случае сайт только для сериалов и все ответы с названиями находятся между слов &quot;Сериал&quot; и &quot;смотреть онлайн&quot;.</p><p>Запускаем динамический скрипт из редактора, нажимаем ОК, переходим к следующей созданной динамически папке, заходим в скрипт и снова запускаем. Таким образом проверяем работу динамического скрипта. Реальные запросы для подсказок начинаются только со 2-го набранного символа. Иногда сайт отвечает только на поиск названий не менее 3-х или 4-х символов. Зависит от сайта.</p><p><span class="bbu"><strong>Редактирование скрипта обновления подкаста, добавление функциональности самого поиска.</strong></span><br />Ну а теперь самое сложное.</p><p>То, что мы добавили папку поиска в наш подкаст - на самом деле не добавило функциональности для непосредственного поиска в нашем подкасте. А всего лишь дало возможность добавлять в папку &quot;Поиск&quot; псевдо-разделы с наименованием фильма или сериала. У таких разделов нет настоящей ссылки на сам сериал или фильм. Там есть только название. И этот случай в подкасте мы должны обработать.<br />Т.е. определить, что у обновляемого раздела нет ссылки, а значит сделать поиск самого названия раздела на сайте и создать ссылки.</p><p>Для этого в скрипт обновления подкаста по Alt+2 нужно добавить код, который будет это проверять и делать запрос для поиска. Какой делать запрос мы уже знаем, нам нужно только скорректировать переменные, которые отвечают за то, какую страницу загружать и какие регулярки использовать для поиска видео или сериалов.</p><p>Встаём на папку &quot;Поиск&quot; и нажимаем правой клавишей мышки, выбираем &quot;Добавить подкаст&quot; и вписываем заголовок &quot;Война&quot;. <span class="bbu">Поле ссылки оставляем пустым</span>. Нажимаем ОК. У нас будет добавлен раздел с названием и без ссылки.<br />Так вот нужно добиться того, чтобы при обновлении такого раздела были созданы ссылки на видео или сериалы, которые будут в результате поиска названия такого раздела.</p><p>Встаём на вновь добавленный подкаст, нажимаем Alt+2 и идём в то место скрипта, где у нас загружается страница для парсинга. И вставляем проверку на наличие настоящей ссылки для обновляемого подкаста. Если её нет, то делаем запрос с поиском названия и корректируем переменные, которые содержат регулярные выражения для поиска блоков и информации о фильме (сериале).</p><p>Например, для сайта может быть такой блок в функии LoadAndParse:<br /></p><div class="codebox"><pre><code>  if (LeftCopy(mpFilePath, 4) != &quot;http&quot;) {
    // Если нет ссылки - делаем поиск названия
    sLink = &#039;https://topcinema.tv/search/video/?q=&#039;+HmsPercentEncode(HmsUtf8Encode(mpTitle));
    sHtml = HmsDownloadURL(sLink, &#039;Referer: &#039;+gsUrlBase, true);
    
  } else {
    // Иначе просто, загружаем страницу по ссылке
    sHtml = HmsDownloadURL(mpFilePath, &#039;Referer: &#039;+gsUrlBase, true);
    
  }</code></pre></div><p>В данном случае даже регулярные выражения для поиска блоков, названий, ссылок и картинок не нужно изменять, чтобы отобразить результаты поиска. Т.е. он выдаётся точно в таком же формате как и простой список сериалов для любого другого раздела.</p><p>Но иногда приходится менять регулярки и учитывать это в условиях. Также, часто за сайтах запросы именно для поиска могут быть POST. Тогда код проверки и запроса будет немного сложнее:<br /></p><div class="codebox"><pre><code>  if (LeftCopy(mpFilePath, 4) != &quot;http&quot;) {
    // Если нет ссылки - делаем поиск названия
    HmsRegExMatch(&#039;//(.*)&#039;, gsUrlBase, sServ); // получаем доменное имя из gsUrlBase в sServ
    sPost = &#039;do=search&amp;subaction=search&amp;titleonly=3&amp;story=&#039;+HmsHttpEncode(mpTitle);
    sHtml = HmsSendRequestEx(sServ, &#039;/index.php?do=search&#039;, &#039;POST&#039;,
                             &#039;application/x-www-form-urlencoded; Charset=UTF-8&#039;, 
                             gsUrlBase+&#039;/\r\nAccept-Encoding: gzip, deflate\r\nOrigin: &#039;+gsUrlBase, 
                             sPost, 80, 0, &#039;&#039;, true);

  } else {
    // Иначе просто, загружаем страницу по ссылке
    sHtml = HmsDownloadURL(mpFilePath, &#039;Referer: &#039;+gsUrlBase, true);

  }</code></pre></div><p>Это просто пример, если бы запрос для поиска был бы методом POST.</p><p>Ну вот и всё. Проверяем обновления подкаста с названием и без ссылки и смотрим, будет ли содержаться ответ в запросе от такого поиска и будут ли найдены ссылки на фильмы в таком ответе.</p><p>Может всё немного скомкано, но основные моменты тут раскрыты. Если будут вопросы или сложности с конкретным сайтом, то задавайте вопросы.<br />Потому как сколько сайтов, столько может быть и нюансов. Проще их разбирать на конкретных примерах.</p>]]></content>
			<author>
				<name><![CDATA[WendyH]]></name>
				<uri>https://hms.lostcut.net/profile.php?id=2</uri>
			</author>
			<updated>2017-08-14T18:17:14Z</updated>
			<id>https://hms.lostcut.net/viewtopic.php?pid=9717#p9717</id>
		</entry>
</feed>
