1

Тема: Как добавить поиск себе в подкаст

Организация поиска в подкасте.

Тут я расскажу, как в свой (или не свой) подкаст можно добавить динамическую папку "Поиск" и сделать так, чтобы он (этот поиск) работал.

Для начала, можно установить обработку "Создать ПОИСК" вот отсюда.
После чего в программе должна появиться одноимённая кнопка на панели программы справа.

Данной кнопкой можно воспользоваться, чтобы создать динамическую папку "Поиск" в корневой папке вашего подкаста, который содержит другие разделы.
Для этого нужно встать на саму папку в программе и нажать на эту кнопку "Создать ПОИСК". После чего будет загружен скрипт динамической папки с оф. форума
вот из этого сообщения: http://homemediaserver.ru/forum/viewtop … 395#p17395
(это сделано для того, чтобы можно было загрузить актуальный скрипт, если он там будет доработан и обновлён)
Там же есть небольшое описание что и как, но примеры уже устарели и не актуальны. Поэтому более подробно и на примере я объясню как с этим работать здесь.

По-умолчанию, в этом скрипте используются подсказки от гугла, при наборе символов с устройства (заход и выход и папок букв набирается текст поиска и выполняется запросы для получения подсказок по части набранного слова или слов).
Поэтому, если мы собираемся использовать такой поиск в подкасте для конкретного ресурса, желательно использовать подсказки тех названий, которые есть именно на данном ресурсе. Т.е. использовать нужно запросы для поиска непосредственно к ресурсу.

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

Итак, нам нужно следовать следующим этапам:
1) Добавить папку "Поиск" в корневую папку подкаста.
2) Найти на сайте, для которого мы делаем поиск как именно делается запрос для поиска.
3) Отредактировать динамический скрипт поиска для подсказок с самого сайта.
4) Отредактировать, добавить команды обслуживания поиска и создания элементов в самом подкасте, для обновления раздела с набранным текстом, чтобы выполнить поиск по названию и создать ссылки на найденные элементы.

С первым пунктом всё просто и я уже описал как это можно сделать. Поэтому продолжаем со второго пункта.

Определяем, как происходят запросы поиска на сайте.
На примере сайта topcinema.tv посмотрим, как происходит у них поиск.

Открываем в браузере сайт, находим поле поиска, заходим в инструменты разработчика на вкладку Network (сеть), чтобы видеть все запросы, которые у нас будут происходить, после факта нашего поиска на сайте.
Вписываем какое-либо слово в поле для поиска на самом сайте и нажимаем Enter.
В инструментах разработчика среди всех запросов ищем тот, который отвечает именно за поиск и смотрим в каком формате получается ответ.

Для нас важно следующее:
- по какому адресу (пути) идёт запрос для поиска;
- как закодировано название набранного текста, в UTF-8 или просто в Windows кодировке (определяем по длине кодированного текста);
- каким методом идёт HTTP запрос (POST или GET);
- нужны ли специальные HTTP заголовки для такого запроса (Origin и т.п.);
- в каком виде получаем ответ, в html так же как и основной список видео на сайте или в каком-нибудь формате json (например для ajax запросов).

Например, на сайте topcinema.tv мы можем определить, что запрос на поиск слова "Война" будет такой:
view-source:https://topcinema.tv/search/video/?q=%D0%92%D0%BE%D0%B9%D0%BD%D0%B0
Также видно, что запрос идёт GET и кодировка в текста в обычной UTF-8.
Тут всё оказалось довольно просто.

Редактирование динамического скрипта поиска для подсказок с самого сайта.

Теперь можно подправить текст динамической папки "Набрать текст", чтобы подсказки прилетали именно от нам нужного сайта.
Встаём на папку "Набрать текст" и нажимаем Alt+5, попадаем в динамический скрипт. Там нас интересуют только эти строки:

char gsSuggestQuery    = 'http://www.google.ru/complete/search?sclient=psy-ab&q=';
char gsSuggestResultCut= '';
char gsSuggestRegExpr  = '\\["(.*?)",';
char gsSuggestMethod   = 'GET';
int  gnSuggestNoUTFEnc = 0;

Где переменной
gsSuggestQuery - нужно присвоить путь запроса без самого значения текста поиска (он к нему будет добавляться);
gsSuggestResultCut - регулярное выражение для обрезки нужного блока в ответе, в котором будут происходить поиск нужных слов (необязательно);
gsSuggestRegExpr - регулярное выражение для поиска названия для подсказки (лишние теги в названии будут отброшены);
gsSuggestMethod - метод HTTP запроса (GET или POST);
gnSuggestNoUTFEnc - если нужно не переводить в UTF кодировку искомый текст, то можно установить в значение 1.

Итак, для подсказок с topcinema.tv можно установить эти значения в следующий вид:

char gsSuggestQuery    = 'https://topcinema.tv/search/video/?q=';
char gsSuggestResultCut= '';
char gsSuggestRegExpr  = 'itemprop="name">Сериал(.*?)смотреть';
char gsSuggestMethod   = 'GET';
int  gnSuggestNoUTFEnc = 0;

Тут самое главное в gsSuggestRegExpr - какая именно регулярка там должна стоять - только на усмотрение кодера и в зависимости от формата ответа. В ответе на поиск смотрим код html страницы (по ctrl+u) и смотрим, откуда бы нам выдрать искомые названия. В данном случае сайт только для сериалов и все ответы с названиями находятся между слов "Сериал" и "смотреть онлайн".

Запускаем динамический скрипт из редактора, нажимаем ОК, переходим к следующей созданной динамически папке, заходим в скрипт и снова запускаем. Таким образом проверяем работу динамического скрипта. Реальные запросы для подсказок начинаются только со 2-го набранного символа. Иногда сайт отвечает только на поиск названий не менее 3-х или 4-х символов. Зависит от сайта.

Редактирование скрипта обновления подкаста, добавление функциональности самого поиска.
Ну а теперь самое сложное.

То, что мы добавили папку поиска в наш подкаст - на самом деле не добавило функциональности для непосредственного поиска в нашем подкасте. А всего лишь дало возможность добавлять в папку "Поиск" псевдо-разделы с наименованием фильма или сериала. У таких разделов нет настоящей ссылки на сам сериал или фильм. Там есть только название. И этот случай в подкасте мы должны обработать.
Т.е. определить, что у обновляемого раздела нет ссылки, а значит сделать поиск самого названия раздела на сайте и создать ссылки.

Для этого в скрипт обновления подкаста по Alt+2 нужно добавить код, который будет это проверять и делать запрос для поиска. Какой делать запрос мы уже знаем, нам нужно только скорректировать переменные, которые отвечают за то, какую страницу загружать и какие регулярки использовать для поиска видео или сериалов.

Встаём на папку "Поиск" и нажимаем правой клавишей мышки, выбираем "Добавить подкаст" и вписываем заголовок "Война". Поле ссылки оставляем пустым. Нажимаем ОК. У нас будет добавлен раздел с названием и без ссылки.
Так вот нужно добиться того, чтобы при обновлении такого раздела были созданы ссылки на видео или сериалы, которые будут в результате поиска названия такого раздела.

Встаём на вновь добавленный подкаст, нажимаем Alt+2 и идём в то место скрипта, где у нас загружается страница для парсинга. И вставляем проверку на наличие настоящей ссылки для обновляемого подкаста. Если её нет, то делаем запрос с поиском названия и корректируем переменные, которые содержат регулярные выражения для поиска блоков и информации о фильме (сериале).

Например, для сайта может быть такой блок в функии LoadAndParse:

  if (LeftCopy(mpFilePath, 4) != "http") {
    // Если нет ссылки - делаем поиск названия
    sLink = 'https://topcinema.tv/search/video/?q='+HmsPercentEncode(HmsUtf8Encode(mpTitle));
    sHtml = HmsDownloadURL(sLink, 'Referer: '+gsUrlBase, true);
    
  } else {
    // Иначе просто, загружаем страницу по ссылке
    sHtml = HmsDownloadURL(mpFilePath, 'Referer: '+gsUrlBase, true);
    
  }

В данном случае даже регулярные выражения для поиска блоков, названий, ссылок и картинок не нужно изменять, чтобы отобразить результаты поиска. Т.е. он выдаётся точно в таком же формате как и простой список сериалов для любого другого раздела.

Но иногда приходится менять регулярки и учитывать это в условиях. Также, часто за сайтах запросы именно для поиска могут быть POST. Тогда код проверки и запроса будет немного сложнее:

  if (LeftCopy(mpFilePath, 4) != "http") {
    // Если нет ссылки - делаем поиск названия
    HmsRegExMatch('//(.*)', gsUrlBase, sServ); // получаем доменное имя из gsUrlBase в sServ
    sPost = 'do=search&subaction=search&titleonly=3&story='+HmsHttpEncode(mpTitle);
    sHtml = HmsSendRequestEx(sServ, '/index.php?do=search', 'POST',
                             'application/x-www-form-urlencoded; Charset=UTF-8', 
                             gsUrlBase+'/\r\nAccept-Encoding: gzip, deflate\r\nOrigin: '+gsUrlBase, 
                             sPost, 80, 0, '', true);

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

  }

Это просто пример, если бы запрос для поиска был бы методом POST.

Ну вот и всё. Проверяем обновления подкаста с названием и без ссылки и смотрим, будет ли содержаться ответ в запросе от такого поиска и будут ли найдены ссылки на фильмы в таком ответе.

Может всё немного скомкано, но основные моменты тут раскрыты. Если будут вопросы или сложности с конкретным сайтом, то задавайте вопросы.
Потому как сколько сайтов, столько может быть и нюансов. Проще их разбирать на конкретных примерах.

Sony Bravia KDL-32CX523