Русский > Разработчикам

Разработка скриптов

(1/2) > >>

nostra:
Информация в этом топике больше не актуальна. Свежая справка по скриптам доступна здесь: http://www.videodb.info/help/hlp_scripting.html

Начиная с версии 0.9.8.11 в PVD появилась возможность создания скриптов на языке Pascal для загрузки информации из интернет.

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

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

Кроме всего прочего я постарался создать набор ф-ций, который должен значительно упростить задачу.


Скрипты - это файлы с расширением .psf, находящиеся в папке Scripts. Все скрипты общаются с основной программой с помощью специального движка, который реализован в виде плагина scriptint.dll.
Если этот плагин отсутсвует, то скрипты работать не будут.

Программа встраивает скрипты так, что они по ф-циональности ничем не отличаются от плагинов т.е. их можно настраивать комбинировать и устанавливать по умолчанию.

С помощью скриптов можно загружать:

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


Теперь приступим к созданию скрипта...

nostra:
1.
Откройте в папку Scripts и сделайте копию любого готового скрипта изменив имя файла на то, которые Вы считаете подходящим.

2.
Откройте файл скрипта в текстовом редакторе (любом, я рекомендую Notepad++)


3. Константы
В начале файла находятся описания типов и ф-ций "встроенных" в движок, которые можно использовать для разбора HTML страниц. Эта часть файла - простой комментарий и совершенно необязательна.

Затем идут объявления констант для удобства работы со скриптом. Эти константы тоже не обязательны, но используя их код будет более читабельным. Перед объявлением констант всегда должен быть оператор const

Константы после строчки //Script data - это описание скрипта и их стоит заполнить:
SCRIPT_VERSIONВерсия плагинаSCRIPT_NAMEНазвание плагина (короткое)SCRIPT_DESCОписание плагина (длинное)SCRIPT_LANGЯзык получаемой информации. Пример: $09 - английский, $19 - Русский, $07 - Немецкий. Полный список тут: http://msdn.microsoft.com/en-us/library/ms776294(VS.85).aspx (из этого списка нужно брать число после 0x из колонки "Prim. lang. identifier"). В принципе это не слишком важно укажите ли Вы тут правильный язык, но это всё же желательно для удобства.SCRIPT_TYPEТип скрипта:
* получение информации о фильме (константа stMovies)
* получение информации о персоне (константа stPeople)
* получение постера (константа stPoster)BASE_URLДомен первого уровня веб-сайта. Пример: http://www.amazon.comRATING_NAMEНазвание рейтинга без слова "рейтинг"SEARCH_STRURL используемый для поиска на веб-сайте. %s заменяется названием фильма/именем персоныCODE_PAGEКодировка веб-сайта. На пример для windows-1251 значение этой константы равно 1251. Кодировку можно найти в начале страниц HTML, обычно это что-то вроде этого: <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>. Если Вы не знаете, что тут указать введите 0. Полный список значений можно найти тут: http://msdn.microsoft.com/en-us/library/ms776446.aspx
Вы можете объявить так же какие-то свои константы. (На пример для организации настроек скрипта).


4. Глобальные переменные
После строчки //Global variables находятся глобальные переменные. Глобальные переменные могут хранить любую меняющуюся информация, которая должна быть доступна в любом месте скрипта. Глобальным переменным как и локальным (доступным только в определённой ф-ции) всегда предшествует оператор var

В принципе объявлять какие-либо глобальные переменные не обязательно, но я рекомендую создать хотя бы переменную хранящую текущий режим работы скрипта (поиск, парсинг данных). В моих скриптах эта переменная всегда объявлена так: Mode : Byte;

nostra:
5. Обязательные ф-ции
После того как Вы разобрались с константами и глобальными переменными можно начинать писать сам код. Для обеспечения коммуникации скрипта с движком нужно обязательно написать определённый набор ф-ци:

function GetScriptVersion : WideString;Передаёт версию скриптаfunction GetScriptName : WideString;Передаёт название скриптаfunction GetScriptDesc : WideString;Передаёт описание скриптаfunction GetBaseURL : String;Передёат базовый URL ресурсаfunction GetScriptLang: Cardinal;Передаёт язык получаемых данныхfunction GetScriptType : Byte;Передаёт тип скриптаfunction GetCurrentMode : Byte;Передаёт текущий режим работы скрипта:
* Поиск фильма/персона (константа smSearch)
* Получение данные (любое значение больше 0)function GetDownloadURL : String;Передаёт URL, который нужно загрузить. В режиме поиска фильма/персоны ф-ция должна возвращать SEARCH_STRfunction ParsePage(HTML : WideString; URL : String) : Cardinal;Самая интересная ф-ция в скриптах! :) В переменной HTML содержится код HTML загруженой веб страницы, в переменной URL путь к этой странице. Основная Ваша задача состоит в обработке этих данных.

6. Необязательные ф-ции:
function GetRatingName : WideString;Передаёт название рейтингаfunction GetCodePage : Cardinal;Передаёт кодировку скриптаprocedure GetLoginInfo(out URL : String; out Params : String);Передаёт данные для входа в аккаунт пользователя на используемом веб-сайте. Переменной URL должен быть присвоен путь к скрипту регистрации. Переменной Params параметры, которые нужно передать скрипту регистрации. (используется метод POST)
Если Вы используете уже готовый скрипт в качестве шаблона, то Вам скорее всего не нужно будет изменять обязательные ф-ции за исключением ф-ции function ParsePage(HTML : WideString; URL : String) : Cardinal; и может быть ф-ции function GetDownloadURL : String;

nostra:
7. function GetDownloadURL : String;

В том случае если Ваш скрипт должен только найти фильм/персону и обработать затем только одну страницу с данными, то в этой ф-ции Вам достаточно будет написать вот такой код:

Result := SEARCH_STR

Если нужные данные разбросаны по нескольким страницам, то я рекомендую создать глобальную переменную для дополнительной страницы. Код для 2х страниц будет выглядеть так:

   
 if CreditsURL = '' then
  Result := SEARCH_STR
 else
  Result := SecondPageURL;


Если страниц больше 2х, то можно как дополнительный флаг использовать переменную Mode. На пример вот так (3 страницы):


 if (Mode > smNormal) AND (PosterURL <> '') then
  Result := PosterURL
 else
 if CreditsURL <> '' then
  Result := CreditsURL
 else
  Result := SEARCH_STR;


Если Вы загружаете постер в скрипте сбора информации о фильме или фото в скрипте сбора информации по персоне, то ссылку на изображение нужно передавать в самую последнюю очередь!

nostra:
8. function ParsePage(HTML : WideString; URL : String) : Cardinal;

Теперь самое главное - парсинг HTML.

В этой ф-ции Вам нужно сделать следующее:

* а. Определить что это за страница (с результатом поиска / данными по фильму/персоны)
* б. Установить переменную Mode в соответствующий режим (если он изменился)
* в. Обработать данные на странице
* г. Вернуть результат работы ф-ции
а. Определить что это за страница

Это достаточно просто: нужно найти в коде HTML уникальный "маркер" для каждого типа страницы и искать его по нахождении произведя нужные действия. На пример:
if Pos('<title>Фильм</title>', HTML) > 0 then begin

Затем...
б. Установить переменную Mode в соответствующий режим
Mode := smNormal;

Затем...
в. Обработать данные на странице
ParseMovie(URL, HTML); //Это вспомогательная процедура. Просто чтобы разделить код для лучшей читабельности

Затем...
г. Вернуть результат работы ф-ции
Result := prFinished; //скрипт закончил работу

В конце концов часть кода отвечающая за определение страницы с данными о фильме и произведении обязательных действий будет выглядеть так:

if Pos('<title>Фильм</title>', HTML) > 0 then begin
 Mode := smNormal;
 ParseMovie(URL, HTML); //Это вспомогательная процедура. Просто чтобы разделить код для лучшей читабельности
 Result := prFinished; //скрипт закончил работу
end;


Я рекомендую создать для каждой страницы отдельную процедуру такую как ParseMovie(URL, HTML); в примере т.е. скажем:
procedure ParseSearchResults(HTML : WideString); //парсинг результатов поиска
procedure ParseMovie(MovieURL : WideString; HTML : WideString); //парсинг основной информации о фильме
procedure ParseCredits(HTML : WideString); //парсинг доп. страницы с создателями фильма

Пример полного кода ф-ции ParsePage:
function ParsePage(HTML : WideString; URL : String) : Cardinal;
begin
 if Pos('<title>Поиск по сайту</title>', HTML) > 0 then begin
  ParseSearchResults(HTML);
  Result := prList; //получен список фильмов/персон
end else
 if Pos('Ничего не найдено по запросу', HTML) > 0 then
  Result := prError //произошла ошибка (фильм не найден)
else
 if (Pos('<title>Фильм</title>', HTML) > 0) then begin
  Mode := smNormal;
  ParseMovie(URL, HTML);
  Result := prFinished; //скрипт закончил работу
end else
  Result := prError; //произошла ошибка (не верная страница)
end;

Навигация

[0] Главная страница сообщений

[#] Следующая страница

Перейти к полной версии