//************************************************************************
//*** Парсинг информации о персонах с сайта http://www.kinopoisk.ru    *** 
//***                                                                  ***
//*** Автор:   Reset (http://www.videodb.info/forum_ru)                ***
//*** E-Mail:  pvd_ag@mail.ru                                          ***
//************************************************************************

Var
  loadExtraRole, managerIsProducer, newLineURL, formattedURL, MsgDelay: Boolean;
  nationality, RusNames, maxURL, Delay, optName, optTransName, optPhoto, optBirthDate, optBirthPlace, optDeathDate, optGenre, optURL, optBiography, optAllFilms, optFirstFilm, optLastFilm, optBestFilms, optHeight, optHusbandWife, optDeathPlace, optExtraCareer, optHimselfPlay, pgDoYouKnow, optDoYouKnow, pgSites, optSites, pgAwards, optAward, optVersion: Integer;
  ListDelim, ListSign, russianCountry: String;
Const
  Disabled = 0;  // Опция включена, поле обновляется
  Enabled  = 1;  // Опция отключена, поле не обновляется

//vvvvvvvvvvvvvvvvvvvvvvvvvvvvvv Начало настроек vvvvvvvvvvvvvvvvvvvvvvvvvvvvvv//

Const
    pathToConfig              = '%P\Scripts\kinopoisk_person.cfg';   // Укажите полный путь к файлу конфигурации
                                                      // Можно использовать следующие переменные
                                                      // %P - путь к каталогу с программой
                                                      // %D - путь к каталогу с базой данных


procedure initOptions ();
Begin
     ListDelim         := #13#10;  // Разделитель элементов списка (последовательность #13#10 - новая строка,
                                   //                               повторите два раза - будет пустая строка)
     ListSign          := '» ';    // Начало элемента списка
     nationality       := 0;       // Указание национальности персон
                                   // 0 - автоматическое определение
                                   //     Персона, страна рождения которой входит в список russianCountry,
                                   //     является русской, иначе - зарубежной.
                                   //     При отсутствии места рождения
                                   //     персона с наличием переведенного имени считается зарубежной
                                   //     иначе персона с большим кол-вом русских букв - русская,
                                   //     иначе - зарубежная
                                   // 1 - все персоны - зарубежные
                                   // 2 - все персоны - русские
     russianCountry    := 'Россия,СССР,Soviet Union,Russia';
                                   // Указание русских стран. Не забываем про Россию и СССР.
                                   // Страны перечисляются через запятую без пробелов.
                                   // Написание стран должно соответствовать написанию на сайте КиноПоиска
     RusNames          := 1;       // Правила занесения имени русской персоны (см. nationality)
                                   // 0 - имя транслит, переведенное имя русское
                                   // 1 - имя русское, переведенное имя транслит
                                   // 2 - имя русское, переведенное имя русское
     loadExtraRole     := true;    // Загружать в роль актера дополнительную информацию: не указан в титрах, озвучка
     managerIsProducer := false;   // Заносить директоров фильма в поле "Продюсеры"
     maxURL            := 0;       // Максимальное количество ссылок (0 - без ограничений)
     newLineURL        := false;   // Расположение ссылок
                                   // true  - каждая ссылка в новой строке
                                   // false - все ссылки в одной строке
     formattedURL      := true;    // Форматированные ссылки (не влияет на стандартное поле URL)
                                   // true  - из ссылки убирается "http://", "www." и всё после "/",
                                   //         остается видимым только домен, но ссылка указывает на полный адрес
                                   // false - ссылка подставляется как есть

                                    // Загрузка основной страницы персоны - отключить нельзя
      optName           := Enabled;  // Имя
      optTransName      := Enabled;  // Переведенное имя
      optPhoto          := Enabled;  // Фотография
      optBirthDate      := Enabled;  // День рождения
      optBirthPlace     := Enabled;  // Место рождения
      optDeathDate      := Enabled;  // Дата смерти
      optGenre          := Enabled;  // Жанры
      optURL            := Enabled;  // URL
      optBiography      := Enabled;  // Биография
       optAllFilms      := Enabled;  // Всего фильмов
       optFirstFilm     := Enabled;  // Первый фильм
       optLastFilm      := Enabled;  // Последний фильм
       optBestFilms     := Enabled;  // Лучшие фильмы
       optHeight        := Enabled;  // Рост
       optHusbandWife   := Enabled;  // Супруг(а)
       optDeathPlace    := Enabled;  // Место смерти
       optExtraCareer   := Enabled;  // Дополнительная фильмография
       optHimselfPlay   := Enabled; // Играет самого себя

       pgDoYouKnow      := Enabled;  // Загрузка страницы "Знаете ли Вы, что..."
        optDoYouKnow    := Enabled;  // Знаете ли вы, что

       pgSites          := Enabled;  // Загрузка страницы "Сайты"
        optSites        := Enabled;  // Загрузка сайтов

      pgAwards          := Enabled;  // Загрузка страницы "Награды"
       optAward         := Enabled;  // Загрузка наград
      
      optVersion        := Disabled;  // Версия скрипта


// Задержка между загрузками страниц. 
// Если скрипт говорит, что нет связи с сервером - возможно страница еще
// не успела загрузиться. Увеличте это значение на порядок.
//
// Если и это не помогает - поставьте переменную MsgDelay в True
// Это активирует "ручную" задержку (нужно будет нажимать кнопку ОК)
     Delay := 0;
     MsgDelay := False;
End;

//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Конец настроек ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^//

procedure GetBoolOption (const Data, Name: String; var opt: Boolean);
Var
  curPos, endPos: Integer;
  tmp : String;
Begin
  if Name = '' then
    Exit;

  curPos := Pos (Name + ' ', Data);
  if curPos = 0 then
    Exit;

  curPos := PosFrom ('=', Data, curPos) + 1;
  endPos := PosFrom (';', Data, curPos);
  if (curPos = 0) Or (endPos = 0) then
    Exit;
  tmp := LowerCase (Trim (Copy (Data, curPos, endPos - curPos)));
  if (tmp = 'true') Or (tmp = 'enabled') then
    opt := true
  else if (tmp = 'false') Or (tmp = 'disabled') then
    opt := false;
End;

procedure GetFieldOption (const Data, Name: String; var opt: Integer);
Var
  curPos, endPos: Integer;
  tmp : String;
Begin
  if Name = '' then
    Exit;

  curPos := Pos (Name + ' ', Data);
  if curPos = 0 then
    Exit;

  curPos := PosFrom ('=', Data, curPos) + 1;
  endPos := PosFrom (';', Data, curPos);
  if (curPos = 0) Or (endPos = 0) then
    Exit;
  tmp := LowerCase (Trim (Copy (Data, curPos, endPos - curPos)));
  if tmp = 'enabled' then
    opt := Enabled
  else if tmp = 'disabled' then
    opt := Disabled;
//  else if tmp = 'Add' then
//    opt := Add;
End;

procedure GetIntOption (const Data, Name: String; var opt: Integer);
Var
  curPos, endPos: Integer;
  tmp : String;
Begin
  if Name = '' then
    Exit;

  curPos := Pos (Name + ' ', Data);
  if curPos = 0 then
    Exit;

  curPos := PosFrom ('=', Data, curPos) + 1;
  endPos := PosFrom (';', Data, curPos);
  if (curPos = 0) Or (endPos = 0) then
    Exit;

  tmp := Trim (Copy (Data, curPos, endPos - curPos));
  if tmp = '' then
    Exit;

  opt := StrToInt (tmp);
End;

procedure GetStrOption (const Data, Name: String; var opt: String);
Var
  curPos  : Integer;
  quoting : Boolean;
  str     : String;
Begin
  if Name = '' then
    Exit;

  curPos := Pos (Name + ' ', Data);
  if curPos = 0 then
    Exit;

  curPos := PosFrom ('=', Data, curPos);
  opt := '';
  while (quoting) Or (Data[curPos + 1] <> ';') do
    Begin
    Inc (curPos);
    if (Data[curPos] = '''') And ((Not quoting) Or (Data[curPos + 1] <> '''')) then
      quoting := Not quoting;
    if quoting then str := 'true' else str := 'false';
    if (Data[curPos] = '''') then
      Continue;
    if quoting Or (Data[curPos] <> ' ') then
      opt := opt + Data[curPos];
    End;
  opt := StringReplace (opt, '#13#10', #13#10, true, true, false);
End;

procedure loadOptions ();
Var
  Data : String;
  path : String;
Begin
  path := StringReplace (pathToConfig, '%P', GetAppPath, true, true, false);
  path := StringReplace (path, '%D', GetDBPath, true, true, false);
  Data := FileToString (path);
  if Data <> '' then
    Begin
    GetBoolOption (Data, 'loadExtraRole', loadExtraRole);
    GetBoolOption (Data, 'managerIsProducer', managerIsProducer);
    GetBoolOption (Data, 'newLineURL', newLineURL);
    GetBoolOption (Data, 'formattedURL', formattedURL);
    GetBoolOption (Data, 'MsgDelay', MsgDelay);
    
    GetFieldOption (Data, 'optName', optName);
    GetFieldOption (Data, 'optTransName', optTransName);
    GetFieldOption (Data, 'optPhoto', optPhoto);
    GetFieldOption (Data, 'optBirthDate', optBirthDate);
    GetFieldOption (Data, 'optBirthPlace', optBirthPlace);
    GetFieldOption (Data, 'optDeathDate', optDeathDate);
    GetFieldOption (Data, 'optGenre', optGenre);
    GetFieldOption (Data, 'optURL', optURL);
    GetFieldOption (Data, 'optBiography', optBiography);
    GetFieldOption (Data, 'optAllFilms', optAllFilms);
    GetFieldOption (Data, 'optFirstFilm', optFirstFilm);
    GetFieldOption (Data, 'optLastFilm', optLastFilm);
    GetFieldOption (Data, 'optBestFilms', optBestFilms);
    GetFieldOption (Data, 'optHeight', optHeight);
    GetFieldOption (Data, 'optHusbandWife', optHusbandWife);
    GetFieldOption (Data, 'optDeathPlace', optDeathPlace);
    GetFieldOption (Data, 'optExtraCareer', optExtraCareer);
    GetFieldOption (Data, 'optHimselfPlay', optHimselfPlay);
    GetFieldOption (Data, 'pgDoYouKnow', pgDoYouKnow);
    GetFieldOption (Data, 'optDoYouKnow', optDoYouKnow);
    GetFieldOption (Data, 'pgSites', pgSites);
    GetFieldOption (Data, 'optSites', optSites);
    GetFieldOption (Data, 'pgAwards', pgAwards);
    GetFieldOption (Data, 'optAward', optAward);
    GetFieldOption (Data, 'optVersion', optVersion);

    GetIntOption (Data, 'nationality', nationality);
    GetIntOption (Data, 'RusNames', RusNames);
    GetIntOption (Data, 'maxURL', maxURL);
    GetIntOption (Data, 'Delay', Delay);

    GetStrOption (Data, 'ListDelim', ListDelim);
    GetStrOption (Data, 'ListSign', ListSign);
    GetStrOption (Data, 'russianCountry', russianCountry);
    End;
End;



//********** Далее находятся переменные, предназначенные для внутреннего использования **********// 
Const
     mcDebug		= 0;
 // Уникальные символы при парсинге
 // Заполнены и вынесены в константы не все
     mcSearchOk    = '<title>Результаты поиска ('; 			  // Поиск успешно завершен
     mcNotFound    = 'К сожалению, по вашему запросу ничего не найдено.'; // Ничего не найдено
     mcPersonFirst = '<!-- инфа об актере -->'; 				  // Начало инфы о фильме
     mcSearchFirst = 'Скорее всего вы ищете'; 				  // Начало страницы поиска
     mcSearchEnd   = '<!-- /результаты поиска -->';		  // Конец страницы поиска
     mcPersonLink1 = '/level/4/people';					  // Начало. Ссылка на персону со страницы поиска
     mcPersonLink2 = '">';						        // Конец.  Ссылка на персону со страницы поиска

const
 //Результаты парсинга
 prError     = 0; 
 prFinished  = 1;
 prList      = 2;
 prListImage = 3;
 prDownload  = 4;  // 0.9.9.x
// prDownload  = 3;  // 0.9.8.x

 //Типы работы скрипта
 stMovies = 0;
 stPeople = 1; 
 stPoster = 2;

 smSearch        = 0;
 smDoYouKnow     = 1;
 smSites         = 2;
 smAwards        = 3;
 smPhoto         = 4;
 smFinished      = 5;

 //Поля фильма
 mfURL         = 0;
 mfName        = 1;
 mfTransName   = 2;
 mfOtherName   = 3;
 mfBirthDate   = 4;
 mfBirthPlace  = 5;
 mfGenre       = 6;
 mfBiography   = 7;
 mfDeathDate   = 8;
 mfComments    = 9;

 //Участники фильмов
 mpActor       = 0;
 mpDirector    = 1;
 mpScenario    = 2;
 mpComposer    = 3;
 mpProducer    = 4;
 mpExtra       = 5;

 //Методы загрузки
 dmGET  = 0;
 dmPOST = 1;


const
 SCRIPT_VERSION = '0.1.0.27'; 
 SCRIPT_NAME    = 'КиноПоиск.Ru';
 SCRIPT_DESC    = '[RU] Импортировать информацию о персоне из КиноПоиск.Ru';
 SCRIPT_LANG    = $19; //Russian
 SCRIPT_TYPE    = stPeople;

 BASE_URL       = 'http://www.kinopoisk.ru';

 RATING_NAME 	  = 'КиноПоиск.Ru';
 SEARCH_STR	    = 'http://www.kinopoisk.ru/search/search.php?what=actor&find=%s';
 CODE_PAGE   	  = 1251;

var
  Mode         : Byte;
  ExtraLinks   : array [smDoYouKnow..smFinished] of String;
  LoadPages    : array [smDoYouKnow..smFinished] of Integer;
  Biography    : String;
  ExtraCareer  : String;
  isRussian    : Boolean;
  optionsInitialized : Boolean;


function GetScriptVersion : String;
begin
  Result := SCRIPT_VERSION;
end; 
 
function GetScriptName : String;
begin
  Result := SCRIPT_NAME;
end;

function GetScriptDesc : String;
begin
 Result := SCRIPT_DESC;
end;

function GetRatingName : String;
begin
 Result := RATING_NAME;
end;

function GetBaseURL : AnsiString;
begin
 Result := BASE_URL;  // 0.9.9.x
// Result := BASE_URL + '/';  // 0.9.8.x
end;

function GetScriptLang: Cardinal;
begin
 Result := SCRIPT_LANG;
end;

function GetCodePage : Cardinal;
begin
 Result := CODE_PAGE;
end;

function GetScriptType : Byte; 
begin
 Result := SCRIPT_TYPE;
end;

function GetCurrentMode : Byte; 
begin
 Result := Mode;
end;

function GetDownloadURL : AnsiString;
begin
  if mode = smSearch then 
    Result := SEARCH_STR
  else
    Result := ExtraLinks[mode];
end;

function GetDownloadMethod : Byte;
begin
    Result := dmGET;
end;

// ******** Основной код программы *********************************
Const
  Count = 43;
function Replace(inStr: String): String;
Var
  I: Integer;
  Before, After : array [1..Count] of String;
Begin
//  inStr := HTMLToText (inStr);

  // Мнемоники
  Before[ 1] := '&bdquo;';   After [ 1] := '„';
  Before[ 2] := '&bull;';    After [ 2] := '•';
  Before[ 3] := '&copy;';    After [ 3] := '©';
  Before[ 4] := '&deg;';     After [ 4] := '°';
  Before[ 5] := '&euro;';    After [ 5] := '€';
  Before[ 6] := '&hellip;';  After [ 6] := '…';
  Before[ 7] := '&laquo;';   After [ 7] := '«';
  Before[ 8] := '&ldquo;';   After [ 8] := '“';
  Before[ 9] := '&lsaquo;';  After [ 9] := '‹';
  Before[10] := '&lsquo;';   After [10] := '‘';
  Before[11] := '&mdash;';   After [11] := '—';
  Before[12] := '&middot;';  After [12] := '·';
  Before[13] := '&ndash;';   After [13] := '–';
  Before[14] := '&plusmn;';  After [14] := '±';
  Before[15] := '&raquo;';   After [15] := '»';
  Before[16] := '&rdquo;';   After [16] := '”';
  Before[17] := '&reg;';     After [17] := '®';
  Before[18] := '&rsaquo;';  After [18] := '›';
  Before[19] := '&rsquo;';   After [19] := '’';
  Before[20] := '&sbquo;';   After [20] := '‚';
  Before[21] := '&sect;';    After [21] := '§';
  Before[22] := '&shy;';     After [22] := '';   // «мягкий» дефис (место возможного переноса)

  // Коды
  Before[23] := '&#130;';    After [23] := '‚';
  Before[24] := '&#132;';    After [24] := '„';
  Before[25] := '&#133;';    After [25] := '...';
  Before[26] := '&#136;';    After [26] := '€';
  Before[27] := '&#137;';    After [27] := '‰';
  Before[28] := '&#139;';    After [28] := '‹';
  Before[29] := '&#139;';    After [29] := '‹';
  Before[30] := '&#145;';    After [30] := '‘';
  Before[31] := '&#146;';    After [31] := '’';
  Before[32] := '&#147;';    After [32] := '“';
  Before[33] := '&#148;';    After [33] := '”';
  Before[34] := '&#149;';    After [34] := '•';
  Before[35] := '&#150;';    After [35] := '–';
  Before[36] := '&#151;';    After [36] := '—';
  Before[37] := '&#153;';    After [37] := '™';
  Before[38] := '&#155;';    After [38] := '›';
  Before[39] := '&#185;';    After [39] := '№';

  // Символы
  Before[40] := '	';       After [40] := '';      // табуляция
  Before[41] := #13#10' ';   After [41] := #13#10;  // пробел в начале абзаца
  Before[42] := '';       After [42] := '';      // и попадается же хреновина всякая (http://www.kinopoisk.ru/level/1/film/5619/)
  Before[43] := #08;         After [42] := '';      // и попадается же хреновина всякая (http://www.kinopoisk.ru/level/4/people/78993/)

  For I := 1 To Count Do
    inStr := StringReplace (inStr, Before [i], After [i], true, false, false);
  Result := HTMLToText (inStr);
End;


// ******** CheckDate ************** Преобразовывает строку с датой в короткий формат ****
function CheckDate(s: String): String;
var
  i, j, num        : Integer;
  months           : array [1..12] of AnsiString;
  items            : TWideArray;
  Day, Month, Year : String;
begin
  months[ 1] := 'январ';
  months[ 2] := 'феврал';
  months[ 3] := 'март';
  months[ 4] := 'апрел';
  months[ 5] := 'ма';
  months[ 6] := 'июн';
  months[ 7] := 'июл';
  months[ 8] := 'август';
  months[ 9] := 'сентябр';
  months[10] := 'октябр';
  months[11] := 'ноябр';
  months[12] := 'декабр'; 

  ExplodeString (s, items, ' ');
  for i := 0 to 2 do
    Begin
    if i > High (items) then Break;
    
    num := StrToInt (items[i]);
    if num > 0 then  // День или год
      Begin
      if num <= 31 then  // День
        Day := items[i]
      else if (num >= 1000) And (num <= 2200) then  // Год
        Begin
        Year := items[i];
        Break;  // Год - последний
        End;
      End
    else  // Месяц
      Begin
      for j := Low (months) to High (months) do
        if Pos (months[j], LowerCase (items[i])) > 0 then Break;
      End;
      if j <= High (months) then
        Month := IntToStr (j);
    End;

  if Year <> '' then
    Begin
    if Day = '' then
      Day := '01'
    else if length (Day) = 1 then
      Day := '0' + Day;
    if Month = '' then
      Month := '01'
    else if length (Month) = 1 then
      Month := '0' + Month;
    Result := Day + '.' + Month + '.' + Year;
    End
  else
    Result := s;
end;


//========== Получение короткой даты ==========//
function GetShortDate (const s: String): String;


Begin
  Result := CheckDate (s);
  if Result = s then
    Result := '';
End;


Function TVVideo(S: String): String;
Var
 Bad               : Array[1..3] Of AnsiString;
 I, curPos, endPos : Integer;
Begin
  Bad[1] := '(ТВ';
  Bad[2] := '(ВИДЕО';
  Bad[3] := '(СЕРИАЛ';
  
  For I := 1 To 3 Do
    Begin
    curPos := Pos(Bad[I], UpperCase(S));
    If curPos > 0 Then
      Begin
      endPos := PosFrom (')', S, curPos) + 1;
      while S[curPos - 1] = ' ' do
        curPos := curPos - 1;
      Delete(S, curPos, endPos - curPos);
      End;
    End;
  S := Replace(S);
  Result := S;
End;


function CheckRus(S: String; isRussia: Boolean) : Boolean;
Var
 Rus, En: Word;
 sRus, sEn: String;
 I: Integer;
Begin
  sRus := 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ';
  sEn  := 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  Rus  := 0;
  En   := 0;
  S := Replace (S);
  For I := 1 To Length(S) Do
    Begin
    If Pos(UpperCase(S[I]), sRus) > 0 Then Inc(Rus);
    If Pos(UpperCase(S[I]), sEn) > 0 Then Inc(En);
    End;
  Result := (Rus > En) Or ((Rus = En) And (isRussia = true));
End;


// ******** ParseSearchResults ****** Парсим результаты поиска *****
procedure ParseSearchResults(HTML : String);
var
 curPos, EndPos      : Integer;     // Начальная и конечная позиции
 Id, Title, Title2   : String;  // Заголовки фильма
 Year, URL, Preview  : String;  // Год выпуска и ссылка на фильм
begin
  // Перейдем к первой персоне
  curPos := Pos ('<tr>', HTML);

  // Парсинг результатов поиска пока начальная позиция больше нуля
  while (curPos > 0) do 
    begin
    curPos := PosFrom ('<td>', HTML, curPos) + 4;
    endPos := PosFrom ('</td>', HTML, curPos);
    Id := Copy (HTML, curPos, endPos - curPos);
    URL := BASE_URL + '/level/4/people/' + Id;

    curPos := PosFrom ('<td>', HTML, endPos) + 4;
    endPos := PosFrom ('</td>', HTML, curPos);
    Title := Copy (HTML, curPos, endPos - curPos);

    curPos := PosFrom ('<td>', HTML, endPos) + 4;
    endPos := PosFrom ('</td>', HTML, curPos);
    Title2 := Copy (HTML, curPos, endPos - curPos);

    curPos := PosFrom ('<td>', HTML, endPos) + 4;
    endPos := PosFrom ('</td>', HTML, curPos);
    Year := Copy (HTML, curPos, endPos - curPos);
    
    // Формирую адрес превью
    Preview := 'http://st.kinopoisk.ru/images/actor/' + Id + '.jpg';

    // Добавляем в результаты поиска
      AddSearchResult(Title, Title2, Year, URL, Preview)
    //ShowMessage (Title + ' | ' + Title2 + ' | ' + Year + ' | ' + URL, 'Search Result');

    // Ищем еще ссылки (если не найдем - результат будет 0)
    curPos := PosFrom ('<tr>', HTML, endPos);
    end;
end;


// ******** ParsePerson *************** Парсим информацию о персоне **********
procedure ParsePerson (PersonURL, HTML : String);
var
  curPos, endPos, First, curPos1  : Integer;
  Tmp, Tmp2                       : String;
  URL, Title, OrigTitle           : String;
  Year, Role, List                : String;
  Country, Name, EngName          : String;
  Categories                      : array [mpActor..mpExtra] of AnsiString;
  Category, i, j, nFilms          : Integer;
  items                           : TWideArray;
  ExtraRole                       : array [1..5] of AnsiString;
  hasOrigName                     : Boolean;
Begin
  if PersonURL[Length (PersonURL)] <> '/' then PersonURL := PersonURL + '/';
  // Заполним ссылки на дополнительную информацию о фильме
  // Знаете ли Вы, что...
  ExtraLinks[smDoYouKnow] := PersonURL + 'view_info/ok/';
  // Сайты
  ExtraLinks[smSites]     := StringReplace (PersonURL, 'level/4/', 'level/15/', True, True, False);
  // Награды
  ExtraLinks[smAwards]    := StringReplace (PersonURL, 'level/4/', 'level/94/', True, True, False) + 'sort/a/';

  LoadPages[smDoYouKnow] := pgDoYouKnow;
  LoadPages[smSites]     := pgSites;
  LoadPages[smAwards]    := pgAwards;
  LoadPages[smPhoto]     := Enabled;

  Biography := '';

  First := Pos ('class="moviename-big">', HTML);

  // URL
  if optURL = Enabled then AddFieldValue (mfURL, PersonURL);

  // Место рождения (блок должен располагаться до имен)
  isRussian := false;
  Country := '';
  curPos := PosFrom('>место рождения<', HTML, First);
  if curPos > 0 then
    begin
     Country := Replace (TextBetween (HTML, '<td>', '</td>', false, curPos));
     if Country = '-' then
       Country := ''
     else
       Begin
       if optBirthPlace = Enabled then AddFieldValue (mfBirthPlace, Country);
       ExplodeString (russianCountry, items, ',');
       for i := Low (items) to High (items) do
         Begin
         if Pos (items[i], Country) > 0 then
           Begin
           isRussian := true;
           Break;
           End;
         End;
       End;
    end;

  // Имя
  Name := '';
  curPos := PosFrom('class="moviename-big">', HTML, First);
  if curPos > 0 then
    begin
    Name := Replace (TextBetween (HTML, 'class="moviename-big">', '</H1>', false, curPos));
//     if optName = Enabled then AddFieldValue (mfName, Replace (Name));
    end;

  // Переведенное имя
  EngName := '';
  hasOrigName := false;
  // Переведенное имя, видимое пользователю (под основным)
  // Его определение необходимо для определения национальности персоны без места рождения
  curPos := PosFrom('<span style="font-size:13px;color:#666">', HTML, First);
  if curPos > 0 then
    begin
    EngName := Replace (TextBetween (HTML, '<span style="font-size:13px;color:#666">', '</span>', false, curPos));
    EngName := Trim (EngName);
    hasOrigName := EngName <> '';
    end;
  // Переведенное имя из подписи фото, там оно есть всегда
  if EngName = '' then
    Begin
    curPos := PosFrom('<img title=''', HTML, First);
    if curPos > 0 then
      begin
      EngName := Replace (TextBetween (HTML, '(', ')', false, curPos));
      if (EngName = ' ') then
        EngName := '';
      end;
    End;

  case nationality of
    0:
      Begin
      if (Country = '') And (Not hasOrigName) then
        isRussian := CheckRus (Name, isRussian);
      End;
    1:
      isRussian := false;
    2:
      isRussian := true;
    End;
  if (Not hasOrigName) And (Not CheckRus (Name, isRussian)) then
    Begin
    EngName := Name;
    Name := '';
    End;
  if (isRussian = false) Or (RusNames = 0) then
    Begin
    if optTransName = Enabled then AddFieldValue (mfName, EngName);
    if optTransName = Enabled then AddFieldValue (mfTransName, Name);
    End
  else if (RusNames = 1) then
    Begin
    if optTransName = Enabled then AddFieldValue (mfName, Name);
    if optTransName = Enabled then AddFieldValue (mfTransName, EngName);
    End
  else if (RusNames = 2) then
    Begin
    if optTransName = Enabled then AddFieldValue (mfName, Name);
    if optTransName = Enabled then AddFieldValue (mfTransName, Name);
    End;

  // Фотография
  curPos := PosFrom('src=''http://st.kinopoisk.ru/images/actor', HTML, First);
  if curPos > 0 then
    begin
     Tmp := TextBetween (HTML, 'src=''', ''' ', false, curPos);
     if optPhoto = Enabled then ExtraLinks[smPhoto] := Tmp;
    end;

  // День рождения
  curPos := PosFrom('>дата рождения<', HTML, First);
  if curPos > 0 then
    begin
     Tmp := Replace (HTMLValues2 (HTML, '<td', '</td>', '<a href', '</a>', ' ', curPos));
     if Pos ('|', Tmp) > 0 then
       Delete (Tmp, Pos ('|', Tmp), 255);
     Tmp := GetShortDate (Tmp);
     if Tmp <> '-' then
       if optBirthDate = Enabled then AddFieldValue (mfBirthDate, Tmp);
    end;

  // Дата смерти
  curPos := PosFrom('>дата смерти<', HTML, First);
  if curPos > 0 then
    begin
     Tmp := GetShortDate (Replace (TextBetween (HTML, '<td>', '</td>', false, curPos)));
     if Tmp <> '-' then
       if optDeathDate = Enabled then AddFieldValue (mfDeathDate, Tmp);
    end;

  // Жанры
  curPos := PosFrom('>жанры<', HTML, First);
  if curPos > 0 then
    begin
     Tmp := HTMLValues2 (HTML, '<td>', '</td>', '" >', '</a>', ', ', curPos);
     if Tmp <> '-' then
       if optGenre = Enabled then AddFieldValue (mfGenre, Tmp);
    end;
  
  // Фильмография
  curPos := First;
  nFilms := 0;
  Categories[mpActor]    := 'Актер,Актриса';
  Categories[mpDirector] := 'Режиссер,Режиcсер';  // Первая буква 'с' латинская и русская
  Categories[mpScenario] := 'Сценарист';
  Categories[mpComposer] := 'Композитор';
  if (managerIsProducer) then
    Begin
    Categories[mpProducer] := 'Продюсер,Директор фильма';
    Categories[mpExtra]    := 'Оператор';                   // Для карьер, не попадающих в фильмографию
    End
  else
    Begin
    Categories[mpProducer] := 'Продюсер';
    Categories[mpExtra]    := 'Оператор,Директор фильма';   // Для карьер, не попадающих в фильмографию
    End;
  ExtraRole[1] := 'в титрах не указана';
  ExtraRole[2] := 'в титрах не указан';
  ExtraRole[3] := 'озвучка';
  ExtraRole[4] := 'хроника';
  ExtraRole[5] := 'английская версия';
  while true do  // Цикл по категориям
    Begin
    curPos := PosFrom ('class="main_line" height=25 style="color: #f60; white-space: nowrap;', HTML, curPos);  // Начало названия категории
    if curPos = 0 then Break;
    endPos := PosFrom ('class="main_line" align=right style="font-size:', HTML, curPos);  // Конец названия категории
    If endPos <= curPos Then Break;
    Tmp := Copy (HTML, curPos, endPos - curPos);
    curPos := PosFrom ('<div', HTML, curPos) + 1;  // Поиск названия категории
    Tmp2 := TextBetween (HTML, '>', '</div>', false, curPos);  // Название категории
    
    curPos := PosFrom (' class="personPageItems">', HTML, curPos); // Начало блока списка фильмов в категории
//    curPos := PosFrom ('<tr><td colspan=3 style="padding-left:20px">', HTML, curPos); // Начало блока списка фильмов в категории (альтернатива верхнему)
    if curPos = 0 then Break;
    endPos := PosFrom ('</td></tr>', HTML, curPos);  // Конец блока списка фильмов в категории
    If endPos <= curPos Then Break;
    Tmp := Copy (HTML, curPos, endPos - curPos);
    Tmp := StringReplace (Tmp, 'class=''gray''', '', true, true, false);
    Tmp := StringReplace (Tmp, ' >', '>', true, false, false);
    
    if ((optHimselfPlay = Disabled) And ((Tmp2 = 'Актер: Играет самого себя') Or 
      (Tmp2 = 'Актриса: Играет саму себя'))) then
      Begin
      curPos := endPos;
      Continue;
      End;
      
    

    category := mpExtra;
    for i := Low (Categories) to High (Categories) do
      Begin
      ExplodeString (Categories[i], items, ',');
      for j := Low (items) to High (items) do
        Begin
        if Pos (items[j], Tmp2) > 0 then
          Begin
          if (((i = mpActor) And (Pos (': Дубляж', Tmp2) > 0)) Or
            (i = mpExtra) Or
            ((i = mpDirector) And (Pos ('дубляжа', Tmp2) > 0))) then
            ExtraCareer := ExtraCareer + Tmp2 + #13#10
          else
            category := i;
          Break;
          End;
        End
      End;

    curPos := 1;
    while true do  // Цикл по фильмам в категории
      Begin
      curPos := PosFrom ('<div class="item">', Tmp, curPos);
      if curPos = 0 then Break;
      
      url := BASE_URL + Replace (TextBetween (Tmp, '<span class="name"><a href="', '">', false, curPos));
      title := TVVideo (TextBetween (Tmp, '">', '&nbsp;(', false, curPos));
      year := Replace (TextBetween (Tmp, '(', ')', false, curPos));
      year := Copy (year, 1, 4);
      origtitle := TextBetween (Tmp, '<span class="role">', '</span>', false, curPos);
      curPos1 := Pos ('&nbsp;...&nbsp;', origtitle);
      if curPos1 > 0 then
        Begin
        role := Replace (Copy (origtitle, curPos1 + 15, 255));
        Delete (origtitle, curPos1, 255);
        if loadExtraRole = false then
          begin
          for i := Low (ExtraRole) to High (ExtraRole) do
            begin
            curPos1 := pos (ExtraRole[i], role);
            if curPos1 > 0 then
              Begin
              Delete (role, curPos1, length (ExtraRole[i]));
              if PosFrom (', ',  role, curPos1 - 2) = curPos1 - 2 then
                Delete (role, curPos1 - 2, 2);
              End;
            end;
          end;
        End
      else
        role := '';
      origtitle := Replace (origtitle);
      while (length (origtitle) > 0) do
        Begin
        if  (origtitle[length(origtitle)] <> ' ') then Break;
        Delete (origtitle, length (origtitle), 1);
        End;
      if Category = mpExtra then
        Begin
        if OrigTitle = '' then
          OrigTitle := Title;
        ExtraCareer := ExtraCareer + '   ' + Year
          + '   <link title="' + Title + '">' + Title + '</link>'
          + ' / <link otitle="' + OrigTitle + '">' + OrigTitle + '</link>';
        if Role <> '' then
          ExtraCareer := ExtraCareer + ' ... ' + Role;
        ExtraCareer := ExtraCareer + #13#10;
        End

{          Begin
          ExplodeString (Tmp, items, ';');
          Tmp := '';
          for i := Low (items) to High (items) do
            Tmp := Tmp + '<link title="' + items[i] + '">' + items[i] + '</link>; ';
          Delete (Tmp, length (Tmp) - 1, 2);
          Biography := Biography + #13#10 + 'Лучшие фильмы: ' + Tmp + '.';
          End;}
      else
        AddPersonMovie (Title, OrigTitle, Role, Year, URL, Category);
      Inc (nFilms);
    // ShowMessage ('''' + Title + '''' + #13#10 + '''' + OrigTitle + '''' + #13#10 + '''' + Role + '''' + #13#10 + '''' + Year + '''' + #13#10 + '''' + URL + '''' + #13#10 + '''' + IntToStr (Category) + '''', '');
      End;
    curPos := endPos;
    End;

  // Биография
  Biography := '';
  if optBiography = Enabled then
    Begin
    // Всего фильмов
    if optAllFilms = Enabled then
      Begin
      curPos := PosFrom ('>всего фильмов<', HTML, First);
      if curPos > 0 then
        Biography := Biography + 'Всего фильмов: ' + TextBetween (HTML, '<td>', '</td>', false, curPos) + '.   '
      else
        Biography := Biography + 'Всего фильмов: около ' + IntToStr (nFilms) + '.   ';
      End;
    // Первый фильм
    if optFirstFilm = Enabled then
      Begin
      curPos := PosFrom ('>первый фильм<', HTML, First);
      if curPos > 0 then
        Biography := Biography + 'Первый: ' + TextBetween (HTML, '<td>', '</td>', false, curPos) + ' год.   ';
      End;
    // Последний фильм
    if optLastFilm = Enabled then
      Begin
      curPos := PosFrom ('>последний фильм<', HTML, First);
      if curPos > 0 then
        Biography := Biography + 'Последний: ' + TextBetween (HTML, '<td>', '</td>', false, curPos) + ' год.';
      End;
    // Лучшие фильмы
    if optBestFilms = Enabled then
      Begin
      curPos := PosFrom ('>Лучшие фильмы:<', HTML, First);
      if curPos > 0 then
        Begin
        Tmp2 := Copy (HTML, curPos, PosFrom ('</table>', HTML, curPos) - curPos + 8);
        endPos := 1;
        List := '';
        while (true) do
          Begin
          curPos := PosFrom ('<span>', Tmp2, endPos);
          if (curPos = 0) then
            Break;
          
          endPos := PosFrom ('</span>', Tmp2, curPos);
          Tmp := Copy (Tmp2, curPos, endPos - curPos);
          
          curPos := 1;
          Title := TextBetween (Tmp, '/">', '</a>', false, curPos);
          if (Title = '') then
            Continue;
            
          Role := TextBetween (Tmp, '<i>', '</i>', false, curPos);
          List := List + '<link title="' + Title + '">' + Title + '</link>';
          if (Role <> '') then
            List := List + ' (' + Role + ')';
          List := List + '; ';
          End;
        if (List <> '') then
          Begin
          Delete (List, length (List) - 1, 2);
          Biography := Biography + #13#10 + 'Лучшие фильмы: ' + List + '.';
          End;
        End;
      End;
    if Biography <> '' then
      Biography := Biography + #13#10;
    // Рост
    if optHeight = Enabled then
      Begin
      curPos := PosFrom ('>рост<', HTML, First);
      if curPos > 0 then
        Biography := Biography + 'Рост: ' + TextBetween (HTML, '<td>', '</td>', false, curPos) + '.' + #13#10;
      End;
    // Супруги, дети
    if optHusbandWife = Enabled then
      Begin
      curPos := PosFrom ('>супруг<', HTML, First);
      if curPos <= 0 then
        curPos := PosFrom ('>супруга<', HTML, First);
      if curPos > 0 then
        Begin
        endPos := PosFrom ('<', HTML, curPos);
        Tmp := Copy (HTML, curPos + 2, endPos - curPos - 2);
        Biography := Biography + 'С' + Tmp + ': ';
        curPos := endPos;
        endPos := PosFrom ('</td></tr>', HTML, curPos);
        Tmp := Copy (HTML, curPos, endPos - curPos + 10);
        Tmp := StringReplace (Tmp, '<br />...', '...', true, false, false);
        Tmp := StringReplace (Tmp, '<br />', '; ', true, false, false);
        Tmp := RemoveTags (Tmp, false);
        Biography := Biography + Tmp + '.' +   #13#10;
        End;
      End;
    // Место смерти
    if optDeathPlace = Enabled then
      Begin
      curPos := PosFrom ('>место смерти<', HTML, First);
      if curPos > 0 then
        Begin
        Tmp := Replace (TextBetween (HTML, '<td class="desc-data">', '</td>', false, curPos));
        if (Tmp <> '') And (Tmp <> '-') then
          Biography := Biography + 'Место смерти: ' + Tmp + '.' + #13#10;
        End;
      End;
    End;
End;


// ******** ParseDoYouKnow ********** Парсим Знаете ли Вы, что *****
procedure ParseDoYouKnow(HTML : String);
var
 curPos		 		: Integer;
 First				: Integer;
Begin
  if (optBiography = Disabled) Or (optDoYouKnow = Disabled) then Exit;

  First := Pos (mcPersonFirst, HTML);
  // Знаете ли вы, что
  curPos := PosFrom ('Знаете ли Вы, что...', HTML, First);
  if curPos > 0 then
    Begin
    if Biography <> '' then
      Biography := Biography + #13#10;
    Biography := Biography + 'Знаете ли Вы, что...' + #13#10 + ListSign +
      HTMLValues2 (HTML, '<ul class="trivia">', '</ul>', '<li', '</li>', ListDelim + ListSign, curPos);
    End;
End;


// ******** ParseSites ************** Парсим страницу с сайтами **** 
procedure ParseSites(HTML : String);
var
 tmp, tmp2, formURL : String;
 res                : String;
 curPos, endPos, i  : Integer;
begin
  if (optURL = Disabled) Or (optSites = Disabled) then Exit;

  curPos := Pos ('Cайты отсутствуют, но кто ищет, тот всегда найдёт!', HTML);
  if curPos > 0 then exit;

  curPos := Pos('<ul class="snap_shots">', HTML);
  endPos := PosFrom('</ul>', HTML, curPos);
  tmp := copy(html, curPos, endpos-curpos);
  curPos := 1;
  res := 'Сайты: ';
  if newLineURL then
    res := res + #13#10;
  i := 0;
  while true do
    Begin
    if (maxURL > 0) And (i >= maxURL) then Break;
    tmp2 := HTMLValues2(tmp, '>', '</a>', '>', '<', ',', curPos);
    if tmp2 = '' then
      Break;
    formURL := tmp2;
    if formattedURL then
      Begin
      formURL := StringReplace (formURL, 'http://', '', false, false, false);
      formURL := StringReplace (formURL, 'www.', '', false, false, false);
      if Pos ('/', formURL) > 0 then
        Delete (formURL, Pos ('/', formURL), 255);
      End;
    res := res + '<link url="' + tmp2 + '">' + formURL + '</link>';
    if newLineURL then
      res := res + #13#10
    else
      res := res + '   ';
    Inc (i);
    End;

  if Biography <> '' then
    Biography := Biography + #13#10;
  Biography := Biography + #13#10 + res;
end;


// ******** ParseAwards ************* Парсим страницу с наградами ** 
const
 CountAwards = 23;
type
  tDelim  = record
   word   : String;
   start  : Integer;
   shift  : Integer;
   end;
procedure ParseAwards(HTML : String);
var
  pos1, pos2, pos3, save	   : Integer;
  posEndAward, posStartCategory : Integer;
  tmpAll, tmp               : String;
  Event, Year, Category     : String;
  Recipient, Award          : String;
  tagAwards                 : array[1..CountAwards] of String;  // Слова, определяющие награду
  won                       : Boolean;
  Items, recipients         : TWideArray;
  i, j, iDelim              : longint;
  hasCategory               : Boolean;
  delims                    : array of tDelim;
begin
  tagAwards[ 1]:='почётный оскар';     // Почётный Оскар - Оскар
  tagAwards[ 2]:='премия';             // Премия Isvema - Венецианский кинофестиваль
                                       // Премия Детского фонда ООН - Берлинский кинофестиваль
                                       // Премия Джона Грирсона за лучший короткометражный фильм - Британская академия
                                       // Премия Дон Кихота - Берлинский кинофестиваль
                                       // Премия имени Александра Корды за самый выдающийся британский фильм года - Британская академия
                                       // Премия имени Дэвида Лина за достижения в режиссуре - Британская академия
                                       // Премия имени Карла Формана самому многообещающему новичку - Британская академия
                                       // Премия имени Энтони Эскуита за достижения в создании музыки к фильму - Британская академия
                                       // Премия Майкла Бэлкона за вклад в британское кино - Британская академия
                                       // Премия Манфреда Зальгебера - Берлинский кинофестиваль
                                       // Премия международного союза кинокритиков - Берлинский кинофестиваль
                                       // Премия недели международных критиков - Венецианский кинофестиваль
                                       // Премия объединенных наций - Британская академия
                                       // Премия Флаэрти за лучший документальный фильм - Британская академия
                                       // Серебряная премия - Каннский кинофестиваль
  tagAwards[ 3]:='приз';               // Большой приз жюри - Каннский кинофестиваль
                                       // Большой приз фестиваля - Каннский кинофестиваль
                                       // Бронзовый Приз - Берлинский кинофестиваль
                                       // Золотой приз - Берлинский кинофестиваль
                                       // Почетный приз Berlinale Camera Award - Берлинский кинофестиваль
                                       // Приз Caligari за инновации в Программе молодого кино - Берлинский кинофестиваль
                                       // Приз DIALOGUE en Perspective - Берлинский кинофестиваль
                                       // Приз Femina-Film Prize - Берлинский кинофестиваль
                                       // Приз Le Premier Regard Award - Каннский кинофестиваль
                                       // Приз Peace Film Award - Берлинский кинофестиваль
                                       // Приз Planet Documentary Film Award - Берлинский кинофестиваль
                                       // Приз Prix UIP Berlin за лучший европейский короткометражный фильм - Берлинский кинофестиваль
                                       // Приз Regards Jeune - Каннский кинофестиваль
                                       // Приз Teddy - Берлинский кинофестиваль
                                       // Приз Альфреда Бауэра - Берлинский кинофестиваль
                                       // Приз ассоциации европейских кинотеатров - Берлинский кинофестиваль
                                       // Приз ассоциации независимого кино (ACID) - Каннский кинофестиваль
                                       // Приз Британской Академии человеку года - Британская академия
                                       // Приз газеты Berliner Morgenpost - Берлинский кинофестиваль
                                       // Приз газеты Berliner Zeitung - Берлинский кинофестиваль
                                       // Приз газеты Siegessaule - Берлинский кинофестиваль
                                       // Приз газеты Tagesspiegel - Берлинский кинофестиваль
                                       // Приз газеты Zitty - Берлинский кинофестиваль
                                       // Приз гильдии немецкого арт-хауса - Берлинский кинофестиваль
                                       // Приз Граса Савойе - Каннский кинофестиваль
                                       // Приз дебютанта Каннского кинофестиваля - Каннский кинофестиваль
                                       // Приз Европейской конфедерации художественного кино - Берлинский кинофестиваль
                                       // Приз Европейской конфедерации художественного кино - Каннский кинофестиваль
                                       // Приз жюри - Каннский кинофестиваль
                                       // Приз за лучший дебют - Берлинский кинофестиваль
                                       // Приз за лучший дизайн DVD - Каннский кинофестиваль
                                       // Приз за лучший короткометражный фильм о Берлине - Берлинский кинофестиваль
                                       // Приз за лучший короткометражный фильм от компании «Кодак» - Каннский кинофестиваль
                                       // Приз за лучший сценарий от общества драматических авторов и композиторов (SACD) - Каннский кинофестиваль
                                       // Приз за лучшую дебютную картину - Берлинский кинофестиваль
                                       // Приз за лучшую реставрацию материала на DVD - Каннский кинофестиваль
                                       // Приз за художественные достоинства - Оскар
                                       // Приз за художественный вклад - Каннский кинофестиваль
                                       // Приз зрительских симпатий - Берлинский кинофестиваль
                                       // Приз зрительских симпатий - Британская академия
                                       // Приз имени Вольфганга Штаудте - Берлинский кинофестиваль
                                       // Приз имени Отто Дибелиуса международного евангелического жюри - Берлинский кинофестиваль
                                       // Приз «Интерфильма» - почетное упоминание - Берлинский кинофестиваль
                                       // Приз компании «Шопар» - Каннский кинофестиваль
                                       // Приз Луиджи де Лаурентиса - Венецианский кинофестиваль
                                       // Приз Марчелло Мастрояни - Венецианский кинофестиваль
                                       // Приз международного евангелического жюри - Берлинский кинофестиваль
                                       // Приз международного комитета по амнистиям - Берлинский кинофестиваль
                                       // Приз Международного центра фильмов для детей и молодежи (C.I.F.E.J.) - Берлинский кинофестиваль
                                       // Приз международной ассоциации кинокритиков (ФИПРЕССИ) - Каннский кинофестиваль
                                       // Приз Международной Католической организации в области кино - Берлинский кинофестиваль
                                       // Приз молодежного жюри - Каннский кинофестиваль
                                       // Приз молодому кинематографисту по итогам Berlinale Talent Campus - Берлинский кинофестиваль
                                       // Приз молодых кинокритиков - Каннский кинофестиваль
                                       // Приз немецкого фонда помощи детям - Берлинский кинофестиваль
                                       // Приз Пасинетти - Венецианский кинофестиваль
                                       // Приз программы по обмену деятелей искусства (DAAD) за лучший короткометражный фильм - Берлинский кинофестиваль
                                       // Приз сенатора в честь женщин, молодости и семьи - Берлинский кинофестиваль
                                       // Приз Сети продвижения азиатского кино (NETPAC) - Берлинский кинофестиваль
                                       // Приз ФИПРЕССИ (конкурсная программа) - Каннский кинофестиваль
                                       // Приз фонда Марии Шелл - Берлинский кинофестиваль
                                       // Приз Франсуа Шале - Каннский кинофестиваль
                                       // Приз французской ассоциации киноискусств (AFCAE) - Каннский кинофестиваль
                                       // Приз французской культуры - Каннский кинофестиваль
                                       // Приз Французской системы национального образования - Каннский кинофестиваль
                                       // Приз экуменического (христианского) жюри - Берлинский кинофестиваль
                                       // Приз экуменического (христианского) жюри - Каннский кинофестиваль
                                       // Приз юношеского кинематографа - Берлинский кинофестиваль
                                       // Серебряный приз - Берлинский кинофестиваль
                                       // Специальная рекомендация Международной Католической организации в области кино - Берлинский кинофестиваль
                                       // Специальный приз Берлина - Берлинский кинофестиваль
                                       // Специальный приз жюри - Венецианский кинофестиваль
                                       // Специальный приз фестиваля Blue Angel за лучший европейский фильм - Берлинский кинофестиваль
  tagAwards[ 4]:='награда';            // Награда «Canal+» - Каннский кинофестиваль
                                       // Награда C.I.D.A.L.C. - Берлинский кинофестиваль
                                       // Награда CinemAvvenire - Венецианский кинофестиваль
                                       // Награда от прессы - Каннский кинофестиваль
                                       // Специальная награда - Британская академия
                                       // Специальная режиссерская награда - Венецианский кинофестиваль
  tagAwards[ 5]:='пальмовая ветвь';    // Золотая пальмовая ветвь - Каннский кинофестиваль
                                       // Почетная пальмовая ветвь - Каннский кинофестиваль
  tagAwards[ 6]:='золотая рельса';     // Большая золотая рельса - Каннский кинофестиваль
                                       // Малая золотая рельса - Каннский кинофестиваль
  tagAwards[ 7]:='золотая камера';     // Золотая камера - Каннский кинофестиваль
  tagAwards[ 8]:='особый взгляд';      // Особый взгляд Каннского кинофестиваля - Каннский кинофестиваль
  tagAwards[ 9]:='золотой наставник';  // Золотой наставник - Каннский кинофестиваль
  tagAwards[10]:='гран-при';           // Гран-при - ММКФ
                                       // Гран-при немецкого фонда помощи детям - Берлинский кинофестиваль
                                       // Технический гран-при - Каннский кинофестиваль
  tagAwards[11]:='надежда французского кино';  // Надежда французского кино - Каннский кинофестиваль
  tagAwards[12]:='упоминание';         // Особое упоминание - Берлинский кинофестиваль
                                       // Особое упоминание - Венецианский кинофестиваль
                                       // Особое упоминание - Каннский кинофестиваль
                                       // Почетное упоминание - Берлинский кинофестиваль
  tagAwards[13]:='медведь';            // Бронзовый Медведь - Берлинский кинофестиваль
                                       // Золотой Медведь - Берлинский кинофестиваль
                                       // Серебряный Медведь - Берлинский кинофестиваль
                                       // Хрустальный медведь - Берлинский кинофестиваль
  tagAwards[14]:='стипендия';          // Стипендия от Нью-Йоркской киноакадемии - Берлинский кинофестиваль
  tagAwards[15]:='диплом';             // Диплом - ММКФ
                                       // Диплом C.I.D.A.L.C. - Берлинский кинофестиваль
                                       // Почетный диплом - ММКФ
  tagAwards[16]:='лев';                // Золотой лев - Венецианский кинофестиваль
                                       // Малый золотой лев - Венецианский кинофестиваль
                                       // Серебряный лев - Венецианский кинофестиваль
                                       // Специальный лев - Венецианский кинофестиваль
  tagAwards[17]:='озеллы';             // Золотые Озеллы - Венецианский кинофестиваль
  tagAwards[18]:='кубок';              // Кубок Вольпи - Венецианский кинофестиваль
                                       // Кубок Муссолини - Венецианский кинофестиваль
  tagAwards[19]:='венецианские горизонты';  // Венецианские горизонты - Венецианский кинофестиваль
  tagAwards[20]:='медаль';             // Золотая медаль президента Сената - Венецианский кинофестиваль
                                       // Медаль - Венецианский кинофестиваль
                                       // Медаль имени Джона Боннера - Оскар
  tagAwards[21]:='рекомендация';       // Специальная рекомендация - Венецианский кинофестиваль
  tagAwards[22]:='святой георгий';     // Бронзовый «Святой Георгий» - ММКФ
                                       // Золотой «Святой Георгий» - ММКФ
                                       // Серебряный «Святой Георгий» - ММКФ
  tagAwards[23]:='сертификат';         // Сертификат заслуг - Британская академия
  
  SetLength (delims, 12);
  delims[ 0].word  := 'Медведь - специальный приз';  // Например: Серебряный Медведь - специальный приз за лучшую комедию
  delims[ 0].start := 7;
  delims[ 0].shift := 3;
  delims[ 1].word  := 'Медведь - почетный приз';  // Например: Серебряный Медведь - почетный приз за короткометражный документальный фильм или фильм о культуре
  delims[ 1].start := 7;
  delims[ 1].shift := 3;
  delims[ 2].word  := 'CinemAvvenire - Кино ';  // Например: Награда CinemAvvenire - Кино за мир во всем мире
  delims[ 2].start := 13;
  delims[ 2].shift := 3;
  delims[ 3].word  := 'Пасинетти - особый приз лучшему';  // Например: Приз Пасинетти - особый приз лучшему актеру
  delims[ 3].start := 23;
  delims[ 3].shift := 1;
  delims[ 4].word  := '(SACD) - ';   // Например: Приз общества драматических авторов и композиторов (SACD) - лучший фильм
  delims[ 4].start := 6;
  delims[ 4].shift := 3;
  delims[ 5].word  := ' за ';        // Например: Премия имени Энтони Эскуита за достижения в создании музыки к фильму
  delims[ 5].shift := 1;
  delims[ 6].word  := ' (';          // Например: Приз молодежного жюри (иностранное кино)
  delims[ 6].shift := 2;
  delims[ 7].word  := ' - ';         // Например: Приз молодых кинокритиков - лучший фильм
  delims[ 7].shift := 3;
  delims[ 8].word  := ' в рамках ';  // Например: Приз Regards Jeune в рамках «Недели критиков»
  delims[ 8].shift := 1;
  delims[ 9].word  := ' лучше';      // Например: Приз компании «Шопар» лучшей молодой актрисе
  delims[ 9].shift := 1;
  delims[10].word  := ' в ';         // Например: Приз Regards Jeune в рамках «Недели критиков»
  delims[10].shift := 1;
  delims[11].word  := ' культуры ';  // Например: Приз французской культуры иностранному кинематографисту года
  delims[11].start := 9;
  delims[11].shift := 1;

  save := 1;
  while save > 0 do  // Цикл по событиям
    begin
//    save := PosFrom('<table cellspacing=0 cellpadding=0 border=0 width=100% style="border:1px solid #ccc">', HTML, save + 1);  // Начало события
    save := PosFrom('<table cellspacing=0 cellpadding=0 border=0 width=100% style="background:', HTML, save + 1);  // Начало события
    if save > 0 then
      begin
      tmpAll := copy (HTML, save, PosFrom ('</table>', HTML, save) - save);  // Событие целиком
      pos1 := 1;
      tmp := TextBetween (tmpAll, '<td height=40 class="news" style="padding:10px">', '</td>', false, pos1);  // Название события с годом
      pos2 := Pos (',', tmp);
      event := Replace (copy(tmp, 1, pos2 - 1));
      year := copy (tmp, pos2 + 2, length (tmp) - pos2 - 5);
      tmp := TextBetween (tmpAll, '<tr>', '</tr>', false, pos1);  // Раздел: награды или номинации - целиком
      while length (tmp) > 7 do // Пока там что-то осмысленное (бывает короткое &nbsp;)
        begin
        if (pos ('Номинации', tmp) > 0) then  // Если нет признака номинации, считаю наградой
          won := false
        else 
          won := true;
        tmp := Replace (HTMLValues2 (tmpAll, '<tr>', '</tr>', '<li', '</li>', ';', pos1));  // Все награды(номинации) через точку с запятой
        tmp := StringReplace (tmp, '  ', ' ', true, true, false);
        ExplodeString(tmp, items, ';');
        for i := low (items) to high (items) do  // Разбор наград(номинаций)
          begin
          // Пытаюсь отделить получателя
          pos2 := lastPos('(«', items[i]);
          if (pos2 <= 0) then
            pos3 := 0
          else
            pos3 := PosFrom ('»)', items[i], pos2);
          Category := items[i];  // Предварительно считаю название награды(номинации) категорией
          if (pos2 > 0) then
            Delete (Category, pos2 - 1, pos3 + 2 - pos2 + 1);
          award := '';
          recipient := Copy (items[i], pos2 + 2, pos3 - pos2 - 2);

          // Со Святым Георгием делаем финт - меняем местами названия награды и категории
          if pos ('Святой Георгий', Category) > 0 then
            begin
            pos2 := pos (' - ', Category);
            Category := Copy (Category, pos2 + 3, length (Category) - pos2 - 2) + ' за ' + copy (Category, 1, pos2 - 1);
            end;
          if Category = 'Приз зрительских симпатий за лучший короткометражный фильм (программа «Панорама»)' then
            Category := 'Приз зрительских симпатий (программа «Панорама») за лучший короткометражный фильм';
          // Награды, из которых можно выделить категории
          hasCategory :=
            ((Event = 'Британская академия') And
              (Pos ('Сертификат заслуг', Category) = 1)) Or
            ((Event = 'Каннский кинофестиваль') And
              ((Pos ('Большой приз жюри', Category) = 1) Or
              (Pos ('Большой приз фестиваля', Category) = 1) Or
              (Pos ('Золотая пальмовая ветвь', Category) = 1) Or
              (Pos ('Международный приз', Category) = 1) Or
              (Pos ('Особое упоминание', Category) = 1) Or
              (Pos ('Особый приз жюри', Category) = 1) Or
              (Pos ('Приз Regards Jeune', Category) = 1) Or
              (Pos ('Приз жюри', Category) = 1) Or
              (Pos ('Приз компании «Шопар»', Category) = 1) Or
              (Pos ('Приз молодежного жюри', Category) = 1) Or
              (Pos ('Приз молодых кинокритиков', Category) = 1) Or
              (Pos ('Приз общества драматических авторов и композиторов (SACD)', Category) = 1) Or
              (Pos ('Приз ФИПРЕССИ', Category) = 1) Or
              (Pos ('Приз французской культуры', Category) = 1) Or
              (Pos ('Серебряная премия', Category) = 1))) Or
            ((Event = 'Берлинский кинофестиваль') And
              ((Pos ('Бронзовый Медведь', Category) = 1) Or
              (Pos ('Бронзовый Приз', Category) = 1) Or
              (Pos ('Гран-при немецкого фонда помощи детям', Category) = 1) Or
              (Pos ('Золотой Медведь', Category) = 1) Or
              (Pos ('Золотой приз', Category) = 1) Or
              (Pos ('Особое упоминание', Category) = 1) Or
              ((Pos ('Особый приз Международной Католической организации в области кино', Category) = 1) And
                (Category <> 'Особый приз Международной Католической организации в области кино (OCIC)')) Or
              (Pos ('Почетное упоминание', Category) = 1) Or
              ((Pos ('Премия Детского фонда ООН', Category) = 1) And
                (Category <> 'Премия Детского фонда ООН - особое упоминание') And
                (Category <> 'Премия Детского фонда ООН (UNICEF)')) Or
              ((Pos ('Приз «Интерфильма»', Category) = 1) And
                (Category <> 'Приз «Интерфильма» - почетное упоминание')) Or
              ((Pos ('Приз Teddy', Category) = 1) And
                (Category <> 'Приз Teddy - особое упоминание') And
                (Category <> 'Приз Teddy - приз зрительских симпатий') And
                (Category <> 'Приз Teddy - приз от жюри')) Or
              ((Pos ('Приз Европейской конфедерации художественного кино', Category) = 1) And
                (Category <> 'Приз Европейской конфедерации художественного кино - особое упоминание') And
                (Category <> 'Приз Европейской конфедерации художественного кино - почетное упоминание') And
                (Category <> 'Приз Европейской конфедерации художественного кино - рекомендация')) Or
              ((Pos ('Приз зрительских симпатий (программа «Панорама»)', Category) = 1) And
                (Category <> 'Приз зрительских симпатий (программа «Панорама»)')) Or
              (Pos ('Приз имени Отто Дибелиуса международного евангелического жюри', Category) = 1) Or
              (Pos ('Приз лучшему молодому таланту', Category) = 1) Or
              ((Pos ('Приз международного евангелического жюри', Category) = 1) And
                (Category <> 'Приз международного евангелического жюри - особое упоминание') And
                (Category <> 'Приз международного евангелического жюри - рекомендация') And
                (Category <> 'Приз международного евангелического жюри - специальная рекомендация')) Or
              ((Pos ('Приз международной ассоциации кинокритиков', Category) = 1) And
                (Category <> 'Приз международной ассоциации кинокритиков - почетное упоминание') And
                (Category <> 'Приз международной ассоциации кинокритиков - рекомендация') And
                (Category <> 'Приз международной ассоциации кинокритиков (ФИПРЕССИ)')) Or
              ((Pos ('Приз Международной Католической организации в области кино', Category) = 1) And
                (Category <> 'Приз Международной Католической организации в области кино - почетное упоминание') And
                (Category <> 'Приз Международной Католической организации в области кино - рекомендация') And
                (Category <> 'Приз Международной Католической организации в области кино (OCIC)')) Or
              ((Pos ('Приз немецкого фонда помощи детям', Category) = 1) And
                (Category <> 'Приз немецкого фонда помощи детям - особое упоминание') And
                (Category <> 'Приз немецкого фонда помощи детям - особый приз')) Or
              ((Pos ('Приз ФИПРЕССИ', Category) = 1) And
                (Category <> 'Приз ФИПРЕССИ - особый взгляд')) Or
              ((Pos ('Приз экуменического (христианского) жюри', Category) = 1) And
                (Category <> 'Приз экуменического (христианского) жюри - особое упоминание')) Or
              ((Pos ('Приз юношеского кинематографа', Category) = 1) And
                (Category <> 'Приз юношеского кинематографа - особое упоминание')) Or
              ((Pos ('Серебряный Медведь', Category) = 1) And
                (Category <> 'Серебряный Медведь - почетное упоминание')) Or
              (Pos ('Серебряный приз', Category) = 1) Or
              (Pos ('Специальная рекомендация Международной Католической организации в области кино', Category) = 1) Or
              (Pos ('Специальный приз экуменического (христианского) жюри', Category) = 1) Or
              ((Pos ('Стимулирующий приз Международной Католической организации в области кино', Category) = 1) And
                (Category <> 'Стимулирующий приз Международной Католической организации в области кино') And
                (Category <> 'Стимулирующий приз Международной Католической организации в области кино - почетное упоминание')) Or
              ((Pos ('Хрустальный медведь', Category) = 1) And
                (Category <> 'Хрустальный медведь - особое упоминание')))) Or
            ((Event = 'Венецианский кинофестиваль') And
              ((Pos ('Бронзовые Озеллы', Category) = 1) Or
              (Pos ('Золотая медаль', Category) = 1) Or
              ((Pos ('Золотой лев', Category) = 1) And
                (Category <> 'Золотой лев за вклад в мировой кинематограф')) Or
              (Pos ('Золотые Озеллы', Category) = 1) Or
              (Pos ('Кубок Биеннале', Category) = 1) Or
              ((Pos ('Кубок Вольпи', Category) = 1) And
                (Category <> 'Кубок Вольпи - специальное упоминание')) Or
              (Pos ('Кубок Муссолини', Category) = 1) Or
              ((Pos ('Лев Сан-Марко', Category) = 1) And
                (Category <> 'Лев Сан-Марко - Гран-при')) Or
              (Pos ('Награда CinemAvvenire', Category) = 1) Or
              ((Pos ('Особое упоминание', Category) = 1) And
                (Category <> 'Особое упоминание')) Or
              (Pos ('Премия ''Bastone Bianco''', Category) = 1) Or
              (Pos ('Премия итальянских журналистов', Category) = 1) Or
              (Pos ('Премия итальянских критиков', Category) = 1) Or
              (Pos ('Премия международной критики', Category) = 1) Or
              (Pos ('Приз «Kinematrix Film Award»', Category) = 1) Or
              (Pos ('Приз Upstream', Category) = 1) Or
              (Pos ('Приз за лучший детский образовательный фильм', Category) = 1) Or
              (Pos ('Приз за лучший документальный фильм', Category) = 1) Or
              (Pos ('Приз за лучший короткометражный фильм', Category) = 1) Or
              (Pos ('Приз за лучший обучающий или научный фильм', Category) = 1) Or
              (Pos ('Приз за техническое совершенство', Category) = 1) Or
              (Pos ('Приз зрительских симпатий', Category) = 1) Or
              (Pos ('Приз льва Сан-Марко', Category) = 1) Or
              ((Pos ('Приз международной ассоциации кинокритиков', Category) = 1) And
                (Category <> 'Приз международной ассоциации кинокритиков - почетное упоминание') And
                (Category <> 'Приз международной ассоциации кинокритиков (ФИПРЕССИ)')) Or
              (Pos ('Приз молодежного кино', Category) = 1) Or
              ((Pos ('Приз Пасинетти', Category) = 1) And
                (Category <> 'Приз Пасинетти - особое упоминание')) Or
              ((Pos ('Приз Рима', Category) = 1) And
                (Category <> 'Приз Рима - специальное упоминание')) Or
              (Pos ('Приз ФИПРЕССИ', Category) = 1) Or
              (Pos ('Серебряная медаль', Category) = 1) Or
              (Pos ('Серебряные Озеллы', Category) = 1) Or
              (Pos ('Серебряный лев', Category) = 1) Or
              (Pos ('Специальная рекомендация', Category) = 1) Or
              (Pos ('Специальный приз', Category) = 1))) Or
            ((Event = 'ММКФ') And
              ((Pos ('Диплом за', Category) = 1) Or
              (Pos ('Золотой приз', Category) = 1) Or
              (Pos ('Бронзовый «Святой Георгий»', Category) = 1) Or
              (Pos ('Серебряный «Святой Георгий»', Category) = 1) Or
              (Pos ('Золотой «Святой Георгий»', Category) = 1) Or
              (Pos ('Приз ФИПРЕССИ', Category) = 1) Or
              (Pos ('Серебряная премия', Category) = 1) Or
              (Pos ('Специальный приз жюри', Category) = 1)
              ));
          for j := low (tagAwards) to high (tagAwards) do  // Пытаюсь выделить из названия категории название награды
            begin
            if pos(tagAwards[j], LowerCase (Category)) = 0 then
              Continue;

            if hasCategory then
              Begin
              for iDelim := Low (delims) to High (delims) do
                Begin
                posEndAward := LastPos(delims[iDelim].word, Category);
                if posEndAward <= 0 then
                  Continue;
                posEndAward := posEndAward + delims[iDelim].start;
                posStartCategory := posEndAward + delims[iDelim].shift;
                Break;
                End;
              End;
            if (not hasCategory) Or (iDelim > High (delims)) then
              Begin
              posEndAward := length (items[i]) + 1;
              posStartCategory := posEndAward;
              End;
            award := copy (Category, 1, posEndAward - 1);
            Delete (Category, 1, posStartCategory - 1);
            if Length (Category) > 0 then
              if (Category [Length (Category)] = ')') And (Pos ('(', Category) = 0) then
                Delete (Category, Length (Category), 1);
            Break;
            end;
          if Length (Category) > 0 then
            Category := UpperCase (Category[1]) + Copy (Category, 2, Length (Category) - 1);  // Замена первой буквы категории на заглавную
          if optAward = Enabled then
            Begin
              if (Recipient <> '') then  // Разделение на получателей и добавление их по отдельности
                Begin
                ExplodeString (Recipient, recipients, ',');
                for j := Low (recipients) to High (recipients) do
                  AddAward(Event, Award, Category, recipients[j], Year, Won);
                End
              else
                AddAward(Event, Award, Category, Recipient, Year, Won);
            End;
          end;

        tmp := TextBetween (tmpAll, '<tr>', '</tr>', false, pos1);
        end;
      end;
    end;
end;


// ******** ParsePage *************** Парсим заданный URL **********
function ParsePage(HTML : String; URL : AnsiString) : Cardinal;
var
 i: longint;
begin
  if Not optionsInitialized then
    Begin
    initOptions ();
    loadOptions ();
    optionsInitialized := true;
    End;
  // Если пришла не HTML-страница
  if (Pos ('error.kinopoisk.ru', URL) > 0) then 
     begin
     Result := prError; //произошла ошибка
     Exit;
     end

  // Если нет результатов поиска
  else if Pos(mcNotFound, HTML) > 0 then 
    begin
    Result := prList;
    Exit;
    end

  // Если есть результат поиска
  else if Pos('<table><tr><td>', HTML) > 0 then 
    begin
    // Парсим эти результаты
    ParseSearchResults(HTML);
    Result := prList; //получен список фильмов/персон
    Exit;
    end

  else 
    begin
    if MsgDelay Then ShowMessage('Ручная задержка', 'Инфо') else
    for i := 1 to delay do begin end;
    case mode of
      smSearch        : ParsePerson(URL, HTML);
      smDoYouKnow     : ParseDoYouKnow(HTML);
      smSites         : ParseSites(HTML);
      smAwards        : ParseAwards(HTML);
      end;

    // Перебираем следующие режимы, пока не найдем режим с непустой страницей
    Repeat
      Inc(Mode);
    until (mode >= smFinished) Or ((GetDownloadURL <> '') And (LoadPages[Mode] = Enabled));
    if Mode >= smPhoto then
      Begin
      // Дополнительная фильмография
      if (optExtraCareer = Enabled) And (ExtraCareer <> '') then
        Begin
        if Biography <> '' then
          Biography := Biography + #13#10#13#10;
        Biography := Biography + 'Дополнительная фильмография' + #13#10 + ExtraCareer;
        End;
      if (optVersion = Enabled) then
        Begin
        if Biography <> '' then
          Biography := Biography + #13#10#13#10;
        Biography := Biography + 'Версия скрипта: ' + SCRIPT_VERSION;
        End;
      Biography := StringReplace (Biography, #13#10#13#10#13#10, #13#10#13#10, true, true, false);
      AddFieldValue (mfBiography, Replace (Biography));
      End;
    if Mode >= smFinished then
      Result := prFinished
    else
      Result := prDownload;
  end; 
end;


{
История изменения скрипта загрузки персон с сайта Кинопоиск

v0.0.0.1 от 01.03.2009
+ Загрузка даты смерти.
+ Загрузка места смерти.
+ Загрузка информации о росте, супругах, количестве фильмов в фильмографии,
  годе первого и последнего фильма.
+ Загрузка в фильмографию фильмов, в которых актер играет самого себя.
+ Загрузка "Знаете ли Вы, что".
+ Определение национальности персоны по месту рождения, а при его отсутствии -
  по имени.
+ Указание, какое имя куда загружать: русское/латинские в имя/переведенное имя.
+ Загрузка сайтов.
+ Загрузка наград.

v0.0.0.2 от 09.03.2009
+ Страны "Soviet Union" и "Russia" добавлены в список русских. За информацию
  спасибо ViNNNtalik
  (http://www.videodb.info/forum_ru/index.php?topic=371.msg5083#msg5083).
+ Добавлена опция ограничения количества URL-ов. Предложил ViNNNtalik
  (http://www.videodb.info/forum_ru/index.php?topic=371.msg5083#msg5083).
  См. опция maxURL.
+ Добавлена опция "каждый URL на новой строке". Предложил ViNNNtalik
  (http://www.videodb.info/forum_ru/index.php?topic=371.msg5083#msg5083).
  См. опцию newLineURL.
+ Добавлена опция форматирования ссылок. См. опцию formattedURL. По умолчанию
  ссылки форматируются: удаляются ведущие "http://", "www" и все после "/" -
  остается только домен.
+ Добавлена загрузка названий лучших фильмов. См. опцию optBestFilms.
* Для унификации изменено описание скрипта на
  "[RU] Импортировать информацию о персоне из КиноПоиск.Ru".
! Исправлено определение национальности для персон без места рождения.

v0.1.0.0 от 23.03.2009
+ В дополнительную фильмографию добавлены операторы.
* Фильмы, в которых актёры дублировали роли, перенесены из фильмографии
  в биографию. За информацию
  (http://www.videodb.info/forum_ru/index.php?topic=371.msg5279#msg5279)
  спасибо ViNNNtalik.

v0.1.0.1 от 08.04.2009
* Теперь в результатах поиска выдаётся не шесть, а десять персон.
* Изменен алгоритм разбора страницы поиска в соответствии с изменениями
  на сайте.
! Исправлено отсутствие внесения фильмографии для некоторых персон. За
  информацию
  (http://www.videodb.info/forum_ru/index.php?topic=440.msg5974#msg5974)
  спасибо Predator.

v0.1.0.2 от 18.04.2009
* Изменение адреса первого referer в связи с изменениями на КиноПоиске (только
  для версии 0.9.8.x).
! При загрузке страницы с ошибкой теперь скрипт завершает работу.

v0.1.0.3 от 10.05.2009
+ Добавлена возможность указания версии скрипта, которой было произведено
  обновление. См. опцию optVersion.
! Устранено появление ошибки в программе версии 0.9.9.5 или выше при загрузке
  даты без года. Такие даты теперь не загружаются. За информацию
  (http://www.videodb.info/forum_ru/index.php?topic=478.msg6681#msg6681)
  спасибо Predator.
! Устранено появление тегов типа "voice_male"></a>" в дополнительной
  фильмографии.

v0.1.0.4 от 20.07.2009
! Исправлена неработоспособность скрипта в связи с изменениями на сайте.

v0.1.0.5 от 05.09.2009
! Некорректное занесение информации о годах выхода первого и последнего
  фильмов.

v0.1.0.6 от 17.09.2009
! Режиссеры дубляжа перенесены из фильмографии в дополнительную
  фильмографию. За информацию
  (http://www.videodb.info/forum_ru/index.php?topic=468.msg8218#msg8218)
  спасибо NikLeon.

v0.1.0.7 от 12.10.2009
! Исправлена некорректная загрузка информации о дополнительных сайтах.
  За информацию
  (http://www.videodb.info/forum_ru/index.php?topic=468.msg8379#msg8379)
  спасибо Lyu Iouk.
* В перечислении сайтов между ними добавлены дополнительные пробелы для
  увеличения наглядности и единообразия с заполнением стандартных полей
  в программе.

v0.1.0.8 от 11.11.2009
! В дополнительную фильмографию теперь добавляется заголовок 'Директор фильма'
! Исправлена загрузка лучших фильмов. Теперь в скобках даётся информация
  о том, в качестве кого эта персона имеет отношение к фильму.

v0.1.0.9 от 22.11.2009
! Исправлено некорректное формирование названий лучших фильмов.

v0.1.0.10 от 12.12.2009
* Теперь можно заносить директоров фильма не в дополнительную фильмографию, а
  в стандартное поле "Фильмография". См. опцию managerIsProducer. За идею
  (http://www.videodb.info/forum_ru/index.php?topic=236.msg8572#msg8572)
   спасибо Aig.
! Исправлена ошибка загрузки даты рождения из-за изменений на сайте.

v0.1.0.11 от 26.12.2009
! Исправлена ошибка загрузки лучших фильмов.

v0.1.0.12 от 27.12.2009
+ Добавлено отображение превью персон в окне поиска. За предложение спасибо
  djek-ural.
! Исправлена ошибка загрузки переведённого имени у русских актёров. За
  информацию и способ исправления спасибо Predator.

v0.1.0.13 от 24.06.2010
! Исправлена загрузка фильмографии. За исправление спасибо BiZet.
! Исправлена загрузка сайтов. За исправление спасибо Predator.

v0.1.0.14 от 13.07.2010
! Исправлена загрузка фильмографии. За информацию
  (http://www.videodb.info/forum_ru/index.php?topic=371.msg10766#msg10766)
  спасибо Natik.

v0.1.0.15 от 05.08.2010
! Исправлена загрузка лучших фильмов. За информацию
  (http://www.videodb.info/forum_ru/index.php?topic=371.msg10803#msg10803)
  спасибо Predator.

v0.1.0.16 от 22.08.2010
! Исправлена загрузка сайтов. За информацию
  (http://www.videodb.info/forum_ru/index.php?topic=371.msg10838#msg10838)
  спасибо Natik.

v0.1.0.17 от 31.08.2010
+ Добавлена возможность использования конфигурационного файла. По умолчанию
  это файл kinopoisk_person.cfg в папке Scripts с программой.

v0.1.0.18 от 05.02.2011
! Исправлен поиск персон.
! Исправлена загрузка изображения (фото).

v0.1.0.19 от 05.02.2011
! Исправлена загрузка фильмографии

v0.1.0.20 от 21.08.2011
! Исправлена подвисание PVD при попытке загрузки фильмографии (скрипт уходил в бесконечный цикл)
! Исправлена загрузка фильмографии
+ Добавлена опция optHimselfPlay для возможности отключения загрузки категории 
  фильмографии "Играет самого себя". По умолчанию отключена.

v0.1.0.21 от 21.08.2011
! Исправлена ошибка с optHimselfPlay. Производила обратное дейтсвие :)

v0.1.0.22 от 21.08.2011
! Исправлена ошибка в фильмографии, связанная с еще не вышедшими фильмами

v0.1.0.23 от 21.08.2011
! Исправлена ошибка, связанная с появлением дебильного символа бэкспейса в ненужном месте

v0.1.0.24 от 25.09.2011
! Исправлена ошибка загрузки жанров

Планы на будущее:
+ Добавить загрузку гонораров актёров
  (http://www.videodb.info/forum_ru/index.php?topic=371.msg6386#msg6386).
+ Убрать дублирование названий фильмов в дополнительной фильмографии
  (http://www.videodb.info/forum_ru/index.php?topic=371.msg6760#msg6760)
+ (решено за счет опции optHimselfPlay) Добавить возможность не добавлять в фильмографию телепередачи
  (http://www.videodb.info/forum_ru/index.php?topic=371.msg6760#msg6760)
+ Загрузка обоев, фотографий, событий.
}
