//************************************************************************
//*** Загрузка изображений для фильмов с сайта http://www.kinopoisk.ru *** 
//***                                                                  ***
//*** Автор:   Reset (http://www.videodb.info/forum_ru)                ***
//*** E-Mail:  pvd_ag@mail.ru                                          ***
//************************************************************************

Var
  maxPages, minImages, maxImages, loadWallpapers, loadPosters, loadCovers, loadFanArt, loadFrame, loadScreenshots, loadFilming, loadPromo, loadConcept, loadMiniPoster, posWallpaper, posPosters, posCovers, posFanArt, posFrame, posScreenshots, posFilming, posPromo, posConcept, posMiniPoster, loadOrigSize, minSizeX, minSizeY, maxSizeX, maxSizeY, rcmSizeX, rcmSizeY, minSizeB, maxSizeB, rcmSizeB, sort, proportion : Integer;
  packetLoad, showCount : Boolean;
  sizeWallpapers : String;

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

procedure initOptions ();
Begin
     maxPages        := 1;     // Максимальное количество страниц для поиска изображений (0 - без ограничений)
     minImages       := 0;     // Минимальное обязательное количество изображений для загрузки
     maxImages       := 0;     // Максимальное количество изображений для загрузки (0 - без ограничений)
                               // Имеет значение только при типе скрипта 0 или 1
                               // При типе скрипта 2 и 3 используется значение 1

                               // Загрузка изображений
                               // Каждая опция из этой группы может принимать следующие значения
                               // 0 - не загружать данный тип изображений
                               // 1 - загружать данный тип изображений всегда
                               // 2 - загружать данный тип изображений только при отсутствии изображений более приоритетного типа
     loadWallpapers  :=  0;    // Загрузка обоев
                               // Из-за технических ограничений их размер в килобайтах будет равен к нулю
     loadPosters     :=  1;    // Загрузка постеров
     loadCovers      :=  2;    // Загрузка обложек
     loadFanArt      :=  2;    // Загрузка фан-арта
     loadFrame       :=  0;    // Загрузка кадров
     loadScreenshots :=  0;    // Загрузка скриншотов
     loadFilming     :=  0;    // Загрузка съёмок
     loadPromo       :=  0;    // Загрузка промо
     loadConcept     :=  0;    // Загрузка концепта
     loadMiniPoster  :=  0;    // Загрузка минипостера с главной страницы
                               // Из-за технических ограничений его размер в килобайтах будет равен к нулю

                               // Порядок загрузки изображений
                               // Дайте каждому типу изображений порядковый номер для загрузки
                               // Если какой-то тип изображений не нужно загружать, установите 0
     posWallpaper    :=  0;    // Загрузка обоев
     posPosters      :=  1;    // Загрузка постеров
     posCovers       :=  2;    // Загрузка обложек
     posFanArt       :=  3;    // Загрузка фан-арта
     posFrame        :=  0;    // Загрузка кадров
     posScreenshots  :=  0;    // Загрузка скриншотов
     posFilming      :=  0;    // Загрузка съёмок
     posPromo        :=  0;    // Загрузка промо
     posConcept      :=  0;    // Загрузка концепта
     posMiniPoster   :=  0;    // Загрузка минипостера с главной страницы

     loadOrigSize    := 0;     // Загрузка изображений оригинального размера
                               // 0 - не грузить
                               // 1 - грузить оригинальный размер вместо нормального
                               // 2 - грузить оригинальный размер вместе с нормальным

     packetLoad      := false; // Режим пакетной загрузки
                               // Опция не имеет значения при типе скрипта 0 и 1 в версии программы 0.9.9.x.
                               // Для этих типов пакетная загрузка устанавливается в настройках программы
                               // При типе скрипта 2-3 используются следующие значения:
                               // true  - все изображения грузятся в пакетном режиме
                               // false - выдается окно выбора

     sizeWallpapers  := '1600,1280,1024,800';  // Приоритет размеров обоев
                               // Перечисляются желаемые ширины через запятую без пробелов
                               // Будет загружен первый подходящий размер

     minSizeX        := 0;     // Минимальный  размер изображения в пикселах по ширине
     minSizeY        := 0;     // Минимальный  размер изображения в пикселах по высоте
     maxSizeX        := 0;     // Максимальный размер изображения в пикселах по ширине (0 - без ограничений)
     maxSizeY        := 0;     // Максимальный размер изображения в пикселах по высоте (0 - без ограничений)
     rcmSizeX        := 800;   // Желаемый     размер изображения в пикселах по ширине (учитывается при сортировке 3)
     rcmSizeY        := 1200;  // Желаемый     размер изображения в пикселах по высоте (учитывается при сортировке 3)

     minSizeB        := 0;     // Минимальный  размер изображения в килобайтах
     maxSizeB        := 0;     // Максимальный размер изображения в килобайтах (0 - без ограничений)
     rcmSizeB        := 0;     // Желаемый     размер изображения в килобайтах (учитывается при сортировке 6)

     proportion      := 0;     // Загружаемые пропорции изображений
                               // 0 - загружать все
                               // 1 - загружать только узкие (вертикальные)
                               // 2 - загружать только длинные (горизонтальные)

     sort            := 3;     // Вид сортировки
                               // 0 - не сортировать
                               // 1 - по размеру в пикселах по возрастанию
                               // 2 - по размеру в пикселах по убыванию
                               // 3 - по размеру в пикселах по удалению от желаемого
                               // 4 - по размеру в байтах по возрастанию
                               // 5 - по размеру в байтах по убыванию
                               // 6 - по размеру в байтах по удалению от желаемого
                               // 7 - от узких к длинным
                               // 8 - от длинных к узким

     showCount       := false; // Признак отображения количества найденных изображений
                               // true  - отображать
                               // 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 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 GetUFOption (const Data, Name: String; var opt: String);
Begin
  GetStrOption (Data, Name, opt);
//  opt := ufPrefix + opt + ufPostfix;
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
    LogMessage ('Настройки будут загружены из файла ' + pathToConfig);  // 0.9.9.x

    GetIntOption (Data, 'maxPages', maxPages);
    GetIntOption (Data, 'minImages', minImages);
    GetIntOption (Data, 'maxImages', maxImages);
    GetIntOption (Data, 'loadWallpapers', loadWallpapers);
    GetIntOption (Data, 'loadPosters', loadPosters);
    GetIntOption (Data, 'loadCovers', loadCovers);
    GetIntOption (Data, 'loadFanArt', loadFanArt);
    GetIntOption (Data, 'loadFrame', loadFrame);
    GetIntOption (Data, 'loadScreenshots', loadScreenshots);
    GetIntOption (Data, 'loadFilming', loadFilming);
    GetIntOption (Data, 'loadPromo', loadPromo);
    GetIntOption (Data, 'loadConcept', loadConcept);
    GetIntOption (Data, 'loadMiniPoster', loadMiniPoster);
    GetIntOption (Data, 'posWallpaper', posWallpaper);
    GetIntOption (Data, 'posPosters', posPosters);
    GetIntOption (Data, 'posCovers', posCovers);
    GetIntOption (Data, 'posFanArt', posFanArt);
    GetIntOption (Data, 'posFrame', posFrame);
    GetIntOption (Data, 'posScreenshots', posScreenshots);
    GetIntOption (Data, 'posFilming', posFilming);
    GetIntOption (Data, 'posPromo', posPromo);
    GetIntOption (Data, 'posConcept', posConcept);
    GetIntOption (Data, 'posMiniPoster', posMiniPoster);
    GetIntOption (Data, 'loadOrigSize', loadOrigSize);
    GetIntOption (Data, 'minSizeX', minSizeX);
    GetIntOption (Data, 'minSizeY', minSizeY);
    GetIntOption (Data, 'maxSizeX', maxSizeX);
    GetIntOption (Data, 'maxSizeY', maxSizeY);
    GetIntOption (Data, 'rcmSizeX', rcmSizeX);
    GetIntOption (Data, 'rcmSizeY', rcmSizeY);
    GetIntOption (Data, 'minSizeB', minSizeB);
    GetIntOption (Data, 'maxSizeB', maxSizeB);
    GetIntOption (Data, 'rcmSizeB', rcmSizeB);
    GetIntOption (Data, 'proportion', proportion);
    GetIntOption (Data, 'sort', sort);

    GetBoolOption (Data, 'packetLoad', packetLoad);
    GetBoolOption (Data, 'showCount', showCount);

    GetStrOption (Data, 'sizeWallpapers', sizeWallpapers);
    End;

  if (scriptType = 0) Or (scriptType = 1) then  // 0.9.9.x
    packetLoad := false;  // 0.9.9.x
End;

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


Const
     mcDebug		= 0;
     mcSearchOk    = '<title>Результаты поиска ('; 			  // Поиск успешно завершен
     mcNotFound    = 'К сожалению, по вашему запросу ничего не найдено.'; // Ничего не найдено
     countImageTypes = 10;
     mcSearchFirst = 'Скорее всего вы ищете'; 				  // Начало страницы поиска
     mcSearchEnd   = '<!-- /результаты поиска -->';		  // Конец страницы поиска
     mcFilmLink1   = '/level/1/film';					  // Начало. Ссылка на фильм со страницы поиска
     mcFilmLink2   = '">';						  // Конец. Ссылка на фильм со страницы поиска

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

  //Типы работы скрипта
  stMovies = 0;
  stPeople = 1; 
  stPoster = 2;
  stScreen = 3;  // 0.9.9.x
  stCover  = 4;  // 0.9.9.x
//  stCover  = 3;  // 0.9.8.x

  // Типы изображений
  imPoster     = 0;
  imScreenshot = 1;
  imFrontCover = 2;
  imCDCover    = 3;

  //Поля фильма для добавления
  mfURL         = 0;
  mfTitle       = 1;
  mfOrigTitle   = 2;
  mfAka         = 3;
  mfYear        = 4;
  mfGenre       = 5;
  mfCategory    = 6;
  mfCountry     = 7;
  mfStudio      = 8;
  mfMPAA        = 9;
  mfRating      = 10;
  mfTags        = 11;
  mfTagline     = 12;
  mfDescription = 13;
  mfDuration    = 14;
  mfFeatures    = 15;

  smSearch        = 0;
  smFirstPage     = 1;
  smSrchImage     = 2;
  smGetNamePoster = 3;
  smLoadPoster    = 4;
  smFinished      = 5;


const
  SCRIPT_VERSION = '0.2.1.11'; 
  SCRIPT_LANG    = $19; //Russian
  SCRIPT_NAME    = 'КиноПоиск.Ru';

  SCRIPT_DESC    = '[RU] Импортировать постеры из КиноПоиск.Ru';
  SCRIPT_TYPE    = stPoster;
//  SCRIPT_DESC    = '[RU] Импортировать скриншоты из КиноПоиск.Ru';
//  SCRIPT_TYPE    = stScreen;
//  SCRIPT_DESC    = '[RU] Импортировать обложку из КиноПоиск.Ru';
//  SCRIPT_TYPE    = stCover;

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

  RATING_NAME    = 'КиноПоиск.Ru';
  SEARCH_STR	    = 'http://www.kinopoisk.ru/index.php?level=7&m_act%5Bwhat%5D=content&m_act%5Bfind%5D=%s';
  CODE_PAGE      = 1251;

var
  Mode       : Byte;
  ExtraLinks : array [smSearch..smFinished] of String;
  optionsInitialized : Boolean;


function GetScriptVersion : String;
begin
  Result := SCRIPT_VERSION;
end; 
 
function GetScriptName : String;
begin
  case scriptType of
//    0:       Result := 'КиноПоиск.Ru. Постеры';  // 0.9.8.x
//    1:       Result := 'КиноПоиск.Ru. Скриншоты';  // 0.9.8.x
//    2:       Result := 'КиноПоиск.Ru. Обложка';  // 0.9.8.x
      0, 1, 2: Result := 'КиноПоиск.Ru';  // 0.9.9.x
    end;
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
  case scriptType of
    0: Result := stPoster;  // 0.9.9.x
//    0: Result := stMovies;  // 0.9.8.x
    1: Result := stScreen;  // 0.9.9.x
//    1: Result := stMovies;  // 0.9.8.x
    2, 3: Result := stCover;  // 0.9.9.x
//    2, 3: Result := stMovies;  // 0.9.8.x
    end;
end;

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

Var
  CoverType: Integer;

function GetCoverType : Byte; //0 - Front, 1 - CD
Begin
  // В текущей реализации загрузки обложек грузится
  // сначала обложка, а затем диск
  Result := CoverType;
  Inc (CoverType);
End;

function GetDownloadURL : AnsiString;
begin
  if mode = smSearch then 
    Result := Search_Str
  else 
    Result := ExtraLinks[mode];
  // Поскольку дисков на сайте нет,
  // то на диск возвращаем пустой ответ - конец загрузки
  if (CoverType = 1) then
    Result := '';
  //ShowMessage ('Result=''' + Result + ''''#10#13'Mode=' + IntToStr (mode), 'GetDownloadURL');
end;

// ******** Основной код программы *********************************
type
  TFlags = array of Boolean;
  TIntArray = array of Integer;
  TFloatArray = array of Single;
  TImage = record
    size_kb    : Single;
    shift_kb   : Single;
    size_x     : Single;
    size_y     : Single;
    size_sq    : Single;
    shift_px   : Single;
    ratio      : Single;
    url        : String;
    preview    : String;
    isLoad     : Boolean;
    posterType : Byte; // Тип постера
    end;
var
  nImages, nPages, iOrigSize  : Integer;
  images                      : array of TImage;
  miniPoster                  : TImage;
  nameImageType, keywordType  : TWideArray;
  namePageType, PartURL       : TWideArray;
  loadImagesType              : TIntArray;
  posImagesType               : TIntArray;


//****** Replace ******** Функция замены мнемоник и кодов на символы **********
function Replace (inStr: String): String;
Var
  I: Integer;
  Before, After : array of String;
Begin
//  inStr := HTMLToText (inStr);

  SetLength (Before, 53);
  SetLength (After, 53);
  // Мнемоники
  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[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] := '&#171;';    After [39] := '«';
  Before[40] := '&#185;';    After [40] := '№';
  Before[41] := '&#187;';    After [41] := '»';

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

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


//******* GetPageWithNextTypeImages ******** Поиск первой страницы для загрузки **********
function GetPageWithNextTypeImages (const HTML: String) : Boolean;
Var
  curPos, endPos, i : Integer;
  PrevAddress : String;
Begin
  PrevAddress := ExtraLinks[smSrchImage];
  ExtraLinks[smSrchImage] := '';
  for i := 1 to countImageTypes do
    Begin
    if (loadImagesType[posImagesType[i]] <= 0) Or
      ((loadImagesType[posImagesType[i]] = 2) And (nImages > 0)) then
      Continue;

    if posImagesType[i] = 10 then  // Мини-постер
      Begin
      SetLength (images, nImages + 42);  // 42 - кол-во изображений на странице (21) x запас (2)
      images[nImages] := miniPoster;
      Inc (nImages);
      // Оставляю пустую запись для возможного оригинального размера
      images[nImages].isLoad := true;
      Inc (nImages);
      loadImagesType[posImagesType[i]] := 0;
      Continue;
      End;

    curPos := Pos ('<li class="act">' + namePageType[posImagesType[i]] + '</li>', HTML);
    if curPos <= 0 then
      curPos := Pos ('/">' + namePageType[posImagesType[i]] + '</a></li>', HTML);
    if curPos <= 0 then
      Continue;
    curPos := Pos ('/level/', PrevAddress) + 7;
    endPos := PosFrom ('/', PrevAddress, curPos);
    Delete (PrevAddress, curPos, endPos - curPos);
    Insert (Copy (partURL[posImagesType[i]], 1, 2), prevAddress, curPos);
    curPos := Pos ('/film/', PrevAddress) + 6;
    curPos := PosFrom ('/', PrevAddress, curPos);
    ExtraLinks[smSrchImage] := Copy (PrevAddress, 1, curPos - 1) +
      Copy (partURL[posImagesType[i]], 3, Length (partURL[posImagesType[i]])) + '/page/1/';
    loadImagesType[posImagesType[i]] := 0;
    Break;
    End;
  Result := ExtraLinks[smSrchImage] <> '';
End;


//****** AddImagesInList ******** Добавление изображений в список с результатами поиска **********
type
  TResult = record
    Title   : String;
    url     : String;
    preview : String;
    end;
function AddImagesInList (): Integer;
Var
  searchResult             : array of TResult;
  nShowPosters, step, ind  : Integer;
  i, j                     : Integer;
  Tmp                      : String;
  size                     : TFloatArray;
Begin
  Result := prListImage;

  SetLength (searchResult, nImages);
  nShowPosters := 0;
  if sort = 0 then
    Begin
    for step := 1 to 2 do
      Begin
      i := -1;
      while true do
        Begin
        Inc (i);
        if (i >= nImages) Or
          ((maxImages > 0) And (nShowPosters >= maxImages)) Or 
          ((step = 2) And (nShowPosters >= minImages))
          then Break;
        with images [i] do
          Begin
          if (isLoad = true) Or
            ((step = 1) And
            ((size_x < minSizeX) Or ((maxSizeX > 0) And (size_x > maxSizeX)) Or
            (size_y < minSizeY) Or ((maxSizeY > 0) And (size_y > maxSizeY)) Or
            (size_kb < minSizeB) Or ((maxSizeB > 0) And (size_kb > maxSizeB)) Or
            ((proportion = 1) And (ratio > 1)) Or ((proportion = 2) And (ratio < 1)))) then Continue;
          isLoad := true;
          Inc (nShowPosters);
          if packetLoad = false then
            Begin
            Tmp := nameImageType[posterType] + ' ' + FloatToStr (size_x) + 'x' + FloatToStr (size_y) + ' (' + FloatToStr (size_kb) + ' Кб)';
            searchResult[nShowPosters].Title := Tmp;
            searchResult[nShowPosters].url := url;
            searchResult[nShowPosters].preview := preview;
            End
          else
            Begin
            if Pos ('.jpg', url) = 0 then
              Begin
              Delete (url, length (url), 1);
              url := StringReplace (url, '/picture/', '/images/poster/', true, false, false) + '.jpg';
              End;
            if (scriptType = imFrontCover) Or (scriptType = imCDCover) then
              i := nImages; // необходимо для окончания цикла добавления изображений
            AddImageURL(scriptType, url);               // 0.9.9.x
//            ExtraLinks[smGetNamePoster] := url; Break;  // 0.9.8.x
            End;
          End;
        End;
      End;
    End
  else
    Begin
    // В массиве size последний индекс отведен под фиктивный элемент
    SetLength (size, nImages + 1);
    if (sort = 1) Or (sort = 2) then
      Begin
      For i := 0 to nImages - 1 do
        size[i] := images[i].size_sq;
      End
    else if sort = 3 then
      Begin
      For i := 0 to nImages - 1 do
        size[i] := images[i].shift_px;
      End
    else if (sort = 4) Or (sort = 5) then
      Begin
      For i := 0 to nImages - 1 do
        size[i] := images[i].size_kb;
      End
    else if sort = 6 then
      Begin
      For i := 0 to nImages - 1 do
        size[i] := images[i].shift_kb;
      End
    else if (sort = 7) Or (sort = 8) then
      Begin
      For i := 0 to nImages - 1 do
        size[i] := images[i].ratio;
      End;
    if (sort = 1) Or (sort = 3) Or (sort = 4) Or (sort = 6) Or (sort = 8) then
      size[nImages] := 100000000
    else if (sort = 2) Or (sort = 5) Or (sort = 7) then
      size[nImages] := 0;
    for step := 1 to 2 do  // Первый шаг - постеры, входящие в ограничения, второй шаг - мин. кол-во постеров
      Begin
      i := -1;
      while true do
        Begin
        Inc (i);
        if (i >= nImages) Or
          ((maxImages > 0) And (nShowPosters >= maxImages)) Or 
          ((step = 2) And (nShowPosters >= minImages))
          then Break;
        ind := nImages;
        for j := 0 to nImages - 1 do
          Begin
          with images [j] do
            Begin
            if (step = 1) And
             ((size_x < minSizeX) Or ((maxSizeX > 0) And (size_x > maxSizeX)) Or
              (size_y < minSizeY) Or ((maxSizeY > 0) And (size_y > maxSizeY)) Or
              (size_kb < minSizeB) Or ((maxSizeB > 0) And (size_kb > maxSizeB)) Or
              ((proportion = 1) And (ratio > 1)) Or ((proportion = 2) And (ratio < 1))) then Continue;
            if (isLoad = false) And
              (((size[nImages] <> 0) And (size[j] < size[ind])) Or
               ((size[nImages] = 0) And (size[j] > size[ind]))) then
              ind := j;
            End;
          End;
        if ind = nImages then Break;
        with images [ind] do
          Begin
          isLoad := true;
          Inc (nShowPosters);
          if packetLoad = false then
            Begin
            Tmp := nameImageType[posterType] + ' ' + FloatToStr (size_x) + 'x' + FloatToStr (size_y) + ' (' + FloatToStr (size_kb) + ' Кб)';
            searchResult[nShowPosters].Title := Tmp;
            searchResult[nShowPosters].url := url;
            searchResult[nShowPosters].preview := preview;
            End
          else
            Begin
            if Pos ('.jpg', url) = 0 then
              Begin
              Delete (url, length (url), 1);
              url := StringReplace (url, '/picture/', '/images/poster/', true, false, false) + '.jpg';
              End;
            if (scriptType = imFrontCover) Or (scriptType = imCDCover) then
              i := nImages; // необходимо для окончания цикла добавления изображений
            AddImageURL(scriptType, url);               // 0.9.9.x
//            ExtraLinks[smGetNamePoster] := url; Break;  // 0.9.8.x
            End;
          End;
        End;
      End;
    End;
  if packetLoad = true then
    Begin
    Result := prFinished;
//    Result := prDownload; Inc (Mode);
    End
  else
    Begin
    for i := 1 to nShowPosters do
      Begin
      if showCount then
        Begin
        Tmp := searchResult[i].Title;
        searchResult[i].Title := IntToStr (i) + '/' +
          IntToStr (nShowPosters) + ' ' + Tmp;
        End;
      AddSearchResult (searchResult[i].Title, '', '', searchResult[i].url, searchResult[i].preview);
      End;
    Inc (Mode);
    End;
End;

//******* SearchPosters ******* Создаем список постеров *******
function SearchPosters(URL, HTML : String): Integer;
var
  curPos, endPos, i, j, pos1 : Integer;
  ind, step, nShowPosters    : Integer;
  tmp, tmp2, name            : String;
  size_px                    : AnsiString;
  items                      : TWideArray;
  size                       : TFloatArray;
  pageType                   : Byte; // Аналог posterType
  searchResult               : array of TResult;
begin
  Result := prListImage;

  For i := 1 to countImageTypes do
    Begin
    if Pos ('class="continue">' + keywordType[i] + '</a>', HTML) > 0 then
      Begin
      pageType := i;
      Break;
      End;
    End;
  //ShowMessage ('pageType=' + IntToStr (pageType), 'SearchPosters');

  curPos := Pos ('>Навигация по базе постеров<', HTML);
  if curPos = 0 then
    curPos := Pos ('>Навигация по базе обоев<', HTML);
  if curPos = 0 then
    curPos := Pos ('>Навигация по базе фотографий<', HTML);
  if curPos > 0 then  // Загрузка информации об изображениях со страниц с изображениями
    Begin
    SetLength (images, nImages + 42);  // 42 - кол-во изображений на странице (21) x запас (2)
    curPos := 1;
    i := nImages;
    while true do
      begin
      if pageType = 1 then  // Загрузка информации об обоях
        Begin
        curPos := PosFrom ('<a href="/picture', HTML, curPos);
        if curPos <= 0 then Break;

        with images[i] do
          Begin
          preview := BASE_URL + TextBetween (HTML, '<img  src="', '" width="170"', false, curPos);
          pos1 := Pos ('/sm_', preview) + 4;
          name := Copy (preview, pos1, PosFrom ('.', preview, pos1) - pos1);
          tmp := Copy (HTML, curPos, PosFrom ('</td>', HTML, curPos) - curPos);
          //ShowMessage ('preview=''' + preview + ''''#13#10'pos1=''' + IntToStr (pos1) + ''''#13#10'name=''' + name + ''''#13#10'Tmp=''' + Tmp + '''', '');
          ExplodeString (sizeWallpapers, items, ',');
          for j := Low (items) to High (items) do
            Begin
            pos1 := Pos ('>' + items[j] + '&times;', tmp);
            if pos1 > 0 then
              Begin
              url := BASE_URL + '/picture/' + name + '/w_size/' + items[j] + '/';
              size_px := TextBetween (tmp, '>', '<', false, pos1);
              Break;
              End;
            End;
          if pos1 = 0 then
            Continue;
          url := BASE_URL + TextBetween (HTML, '<a href="', '"', false, curPos);
          //ShowMessage ('url=''' + url + ''''#13#10'preview=''' + preview + ''''#13#10'size_px=''' + size_px + '''', IntToStr (i));
          ExplodeString (size_px, items, '&times;');
          if High (items) >= 1 then
            Begin
            size_x := StrToInt (items[0]);
            size_y := StrToInt (items[1]);
            End;
          size_sq := size_x * size_y;
          shift_px := abs (size_x / rcmSizeX - 1) + abs (size_y / rcmSizeY - 1);
          size_kb := 0;
          shift_kb := abs (size_kb - rcmSizeB);
          ratio := size_x / size_y;
          isLoad := false;
          posterType := pageType;
          curPos := PosFrom ('</td>', HTML, curPos);
          //ShowMessage (FloatToStr (size_kb) + #13#10 + FloatToStr (shift_kb) + #13#10 + FloatToStr (size_x) + #13#10 + FloatToStr (size_y) + #13#10 + FloatToStr (size_sq) + #13#10 + FloatToStr (shift_px) + #13#10 + FloatToStr (ratio) + #13#10 + url + #13#10 + preview + #13#10 + IntToStr (posterType), '');
          End;
        End
      else  // Загрузка информации обо всех типах, кроме обоев
        Begin
        curPos := PosFrom ('<a href="/picture/', HTML, curPos);
        if curPos <= 0 then Break;

        with images[i] do
          Begin
          url := BASE_URL + TextBetween (HTML, '<a href="', '">', false, curPos);
          preview := BASE_URL + TextBetween (HTML, ' src="', '" width=', false, curPos);
          size_px := TextBetween (HTML, '<b><i>', '</i>', false, curPos);
          Tmp := TextBetween (HTML, '</a>', '</b>', false, curPos);  //Размер в байтах
          //ShowMessage ('url=''' + url + ''''#13#10'preview=''' + preview + ''''#13#10'size_px=''' + size_px + ''''#13#10'Tmp=''' + Tmp + '''', '');
          ExplodeString (size_px, items, '&times;');
          if High (items) >= 1 then
            Begin
            size_x := StrToInt (items[0]);
            size_y := StrToInt (items[1]);
            //ShowMessage ('size_x=''' + items[0] + ''''#13#10'size_y=''' + items[1] + '''', '');
            End;
          size_sq := size_x * size_y;
          shift_px := abs (size_x / rcmSizeX - 1) + abs (size_y / rcmSizeY - 1);
          size_kb := StrToInt (Copy (Tmp, 1, Pos (' ', Tmp) - 1));
          //ShowMessage ('size_kb=''' + FloatToStr (size_kb) + '''', '');
          shift_kb := abs (size_kb - rcmSizeB);
          ratio := size_x / size_y;
          isLoad := false;
          posterType := pageType;
          End;
        End;
      Inc (i);
      // Оставляю пустую запись для возможного оригинального размера
      images[i].isLoad := true;
      images[i].posterType := pageType;
      Inc (i);
      end;
    nImages := i;
    Inc (nPages);

    // Попытка найти следующую страницу с изображениями того же типа
    Result := prListImage;
    if (maxPages = 0) Or (nPages < maxPages) then
      Begin
      curPos := Pos ('<div class="navigator">', HTML);
      if curPos > 0 then
        Begin
        Tmp2 := Copy (HTML, curPos, PosFrom ('</ul>', HTML, curPos) + 5 - curPos);
        curPos := 1;
        tmp := HTMLValues2 (Tmp2, '</span></li>', '</ul>', '<li >', '</li>', ';', curPos);
        if tmp <> '' then
          Begin
          ExplodeString (tmp, items, ';');
          curPos := Pos ('/page/', URL);
          if curPos = 0 then
            curPos := Length (URL) + 1;
          ExtraLinks[smSrchImage] := Copy (URL, 1, curPos - 1) +
            '/page/' + items[0] + '/';
          Result := prDownload;
          End
        End
      End;

    if (Result = prListImage) And ((maxPages = 0) Or (nPages < maxPages)) then
      if GetPageWithNextTypeImages (HTML) then
        Result := prDownload;

    // При необходимости запуск цикла получения информации об изображениях оригинального размера
    if (Result = prListImage) And ((loadOrigSize > 0) Or (packetLoad)) then
//    if Result = prListImage then
      Begin
      iOrigSize := -1;
      if nImages >= 1 then
        Begin
        if images[0].url[length(images[0].url)] = '/' then
          iOrigSize := 0
        else if nImages >= 2 then
          iOrigSize := 1;
        End;
      if iOrigSize >= 0 then
        Begin
        ExtraLinks[smSrchImage] := images[iOrigSize].url;
        Result := prDownload;
        End;
      End;
    End;

  // Получение информации об изображениях, в т.ч. оригинального размера
  curPos := Pos ('/ Просмотр', HTML);
  if curPos > 0 then
    Begin
    if (packetLoad) then
      Begin
      curPos := PosFrom ('" src=''', HTML, curPos) + 7;
      endPos := PosFrom ('''', HTML, curPos);
      images[iOrigSize].url := BASE_URL + Copy (HTML, curPos, endPos - curPos);
      End;
    
    if (loadOrigSize > 0) then
      Begin
      curPos := PosFrom ('>оригинальный размер изображения', HTML, curPos);
      if curPos > 0 then
        Begin
        if loadOrigSize = 1 then
          i := iOrigSize
        else if loadOrigSize = 2 then
          i := iOrigSize + 1;
        with images[i] do
          Begin
          url := images[iOrigSize].url;
          Insert ('or_', url, LastPos ('/', url) + 1);
          preview := images[iOrigSize].preview;
          size_px := TextBetween (HTML, '(', ',', false, curPos);
          Tmp := TextBetween (HTML, ', ', 'Кб', false, curPos);  //Размер в байтах
          ExplodeString (size_px, items, 'x');
          if High (items) >= 1 then
            Begin
            size_x := StrToInt (items[0]);
            size_y := StrToInt (items[1]);
            End;
          size_sq := size_x * size_y;
          shift_px := abs (size_x / rcmSizeX - 1) + abs (size_y / rcmSizeY - 1);
          size_kb := StrToInt (Tmp);
          shift_kb := abs (size_kb - rcmSizeB);
          ratio := size_x / size_y;
          isLoad := false;
          End;
        End;
      End;
    repeat
      iOrigSize := iOrigSize + 2;
      if (iOrigSize >= nImages) then
        Break;
    until (images[iOrigSize].url[length(images[iOrigSize].url)] = '/');
    if iOrigSize < nImages then
      Begin
      ExtraLinks[smSrchImage] := images[iOrigSize].url;
      Result := prDownload;
      End
    else
      Result := prListImage;
    End;

  // Добавление изображений в список или их загрузка
  if Result = prListImage then
    Result := AddImagesInList ();
end;


// ******** ParseMovie ************** Парсим страницу с фильмом ****
function ParseMovie(PersonURL : String; HTML : String): Integer;
var
  curPos : Integer;
Begin
  if PersonURL[Length(PersonURL)] <> '/' then PersonURL := PersonURL + '/';
  // Ссылка на первую с изображениями
  if Pos ('</b>бои</a>', HTML) > 0 then
    ExtraLinks[smFirstPage] := StringReplace(PersonURL, 'level/1/', 'level/12/', True, True, False) + 'page/1/'
  else if Pos ('</b>остеры</a>', HTML) > 0 then
    ExtraLinks[smFirstPage] := StringReplace(PersonURL, 'level/1/', 'level/17/', True, True, False) + 'page/1/'
  else if Pos ('</b>адры</a>', HTML) > 0 then
    ExtraLinks[smFirstPage] := StringReplace(PersonURL, 'level/1/', 'level/13/', True, True, False) + 'page/1/';
  ExtraLinks[smSrchImage] := ExtraLinks[smFirstPage];
  
  nImages := 0;
  nPages  := 0;
  
  SetLength (nameImageType, countImageTypes + 1);
  nameImageType [1 ] := 'Обои';
  nameImageType [ 2] := 'Постер';
  nameImageType [ 3] := 'Обложка';
  nameImageType [ 4] := 'Фан-арт';
  nameImageType [ 5] := 'Кадр';
  nameImageType [ 6] := 'Скриншот';
  nameImageType [ 7] := 'Съёмка';
  nameImageType [ 8] := 'Промо';
  nameImageType [ 9] := 'Концепт';
  nameImageType [10] := 'Мини-постер';

  SetLength (keywordType, countImageTypes + 1);
  keywordType [ 1] := 'Обои';
  keywordType [ 2] := 'Постеры';
  keywordType [ 3] := 'Обложки';
  keywordType [ 4] := 'Фан-арт';
  keywordType [ 5] := 'Фото';
  keywordType [ 6] := 'Скриншоты';
  keywordType [ 7] := 'Съёмки';
  keywordType [ 8] := 'Промо';
  keywordType [ 9] := 'Концепт';
  keywordType [10] := '';

  SetLength (namePageType, countImageTypes + 1);
  namePageType [ 1] := 'обои';
  namePageType [ 2] := 'постеры';
  namePageType [ 3] := 'обложки';
  namePageType [ 4] := 'фан-арт';
  namePageType [ 5] := 'кадры';
  namePageType [ 6] := 'скриншоты';
  namePageType [ 7] := 'съёмки';
  namePageType [ 8] := 'промо';
  namePageType [ 9] := 'концепт';
  namePageType [10] := '';

  SetLength (loadImagesType, countImageTypes + 1);
  loadImagesType[ 1] := loadWallpapers;
  loadImagesType[ 2] := loadPosters;
  loadImagesType[ 3] := loadCovers;
  loadImagesType[ 4] := loadFanArt;
  loadImagesType[ 5] := loadFrame;
  loadImagesType[ 6] := loadScreenshots;
  loadImagesType[ 7] := loadFilming;
  loadImagesType[ 8] := loadPromo;
  loadImagesType[ 9] := loadConcept;
  loadImagesType[10] := loadMiniPoster;

  SetLength (partURL, countImageTypes + 1);
  partURL[ 1] := '12';
  partURL[ 2] := '17';
  partURL[ 3] := '17/adv_type/cover';
  partURL[ 4] := '17/adv_type/fanart';
  partURL[ 5] := '13';
  partURL[ 6] := '13/adv_type/still';
  partURL[ 7] := '13/adv_type/sp';
  partURL[ 8] := '13/adv_type/promo';
  partURL[ 9] := '13/adv_type/concept';
  partURL[10] := '';

  SetLength (posImagesType, countImageTypes + 1);
  posImagesType[posMiniPoster]  := 10;
  posImagesType[posConcept]     :=  9;
  posImagesType[posPromo]       :=  8;
  posImagesType[posFilming]     :=  7;
  posImagesType[posScreenshots] :=  6;
  posImagesType[posFrame]       :=  5;
  posImagesType[posFanArt]      :=  4;
  posImagesType[posCovers]      :=  3;
  posImagesType[posPosters]     :=  2;
  posImagesType[posWallpaper]   :=  1;

  if (loadMiniPoster > 0) And (posMiniPoster > 0) then
    Begin
    curPos := Pos ('<img src="/images/film/', HTML);
    if curPos > 0 then 
      Begin
      with miniPoster do
        Begin
        url := BASE_URL + TextBetween (HTML, '<img src="', '"', false, curPos);
        size_kb := 0;
        shift_kb := rcmSizeB;
        size_x := StrToInt (TextBetween (HTML, 'width="', '"', false, curPos));
        size_y := StrToInt (TextBetween (HTML, 'height="', '"', false, curPos));
        size_sq := size_x * size_y;
        shift_px := abs (size_x / rcmSizeX - 1) + abs (size_y / rcmSizeY - 1);
        ratio := size_x / size_y;
        preview := url;
        isLoad := false;
        posterType := 10;
        End;
      End;
    End;

  Result := prDownload;    
  if (ExtraLinks[smSrchImage] = '') And (nImages > 0) then  // Идем на формирование списка изображений
    Begin
    Mode := smSrchImage;
    Result := SearchPosters ('', '');
    End;
End;

//******* LoadImages ******* Загружаем постеры *******
function LoadImages (HTML : String): Integer;
var
  curPos, endPos  : integer;
  url             : String;
begin
  Result := prDownload;

  curPos := Pos ('<img style="', HTML);
  if curPos = 0 then
    Exit;
  curPos := PosFrom ('src="', HTML, curPos) + 5;
  endPos := PosFrom ('"', HTML, curPos);
  url := Copy (HTML, curPos, endPos - curPos);
  if (scriptType >= 0) then  // 0.9.9.x
//  if scriptType = 0 then  // 0.9.8.x
    ExtraLinks[smGetNamePoster] := url
  else
    Begin
    ExtraLinks[smLoadPoster] := url;
    Result := prFinished;
    End;
end;


// ******** ParseSearchResults ****** Парсим результаты поиска *****
procedure ParseSearchResults(HTML : String);
var
 curPos, EndPos 		: Integer;	// Начальная и конечная позиции
 Title, Title2			: String;   // Заголовки фильма
 Year, URL 			: String;   // Год выпуска и ссылка на фильм
begin
  // Начнем с первого результата
  curPos := Pos(mcSearchFirst, HTML); 
  // Если результатов нет - ошибка, закончим процедуру
  if curPos = 0 then Exit;      
  // Вырежем кусок кода, содержащий результаты
  HTML := Copy(HTML, curPos, Pos(mcSearchEnd, HTML) - curPos); 

  // Перейдем к первому фильму
  curPos := Pos(mcFilmLink1, HTML);

  // Парсинг результатов поиска пока начальная позиция больше нуля
  while (curPos > 0) do 
    begin
    // Вычисляем ссылку на фильм вида /level/1/film/ХХХХХХ/sr/1/
    EndPos := PosFrom(mcFilmLink2, HTML, curPos);
    //Сохраняем URL для этого фильма
    URL := BASE_URL + Copy(HTML, curPos, EndPos - curPos);

    //Вычисляем название этого фильма, сохраняем в Title
    curPos := PosFrom('>', HTML, EndPos) + 1;
    EndPos := PosFrom('</a>', HTML, curPos);
    Title := Replace (Copy(HTML, curPos, EndPos - curPos));

    //Вычисляем год этого фильма, пишем в Year
    endPos := PosFrom ('<a', HTML, endPos);
    endPos := PosFrom ('>', HTML, endPos);
    Year := Copy (HTML, endPos + 1, 4);

    //Вычисляем второе название этого фильма, пишем в Title2
    Title2 := Replace (TextBetween(HTML, '<font color="#999999">', '</font>', False, EndPos));
    if Title2 = '...' then Title2 := '';
    if length (Title2) >= 4 then Delete (Title2, 1, 4);

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

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


// ******** ParsePage *************** Парсим заданный URL **********
function ParsePage(HTML : String; URL : AnsiString) : Cardinal;
var
  i: longint;
  searchNextPage : Boolean;
begin
  if Not optionsInitialized then
    Begin
    initOptions ();
    loadOptions ();
    optionsInitialized := true;
    End;

  // Если пришла не HTML-страница
  if (Pos ('error.kinopoisk.ru', URL) > 0) Or (Pos('<html', HTML) = 0) then 
     Result := prError //произошла ошибка

  // Если страница с результатами поиска - отправляем на загрузку фильма
  else if (Pos(BASE_URL, URL) = 0) Or (Pos(mcNotFound, HTML) > 0) Or (Pos(mcSearchOk, HTML) > 0) then
    Begin
//    ParseSearchResults(HTML);
//    Result := prList; //получен список фильмов/персон
    Result := prError;
    End

  else 
    begin
    if MsgDelay Then ShowMessage('Ручная задержка', 'Инфо') else
    for i := 1 to delay do begin end;
    Result := prDownload;
    searchNextPage := true;
    //ShowMessage ('Mode=' + IntToStr (Mode), 'ParsePage');
    case mode of
      smSearch        : Result := ParseMovie(URL, HTML);
      smFirstPage     : Begin if Not GetPageWithNextTypeImages (HTML) then Result := AddImagesInList (); End;
      smSrchImage     : Begin Result := SearchPosters (URL, HTML); searchNextPage := false; End;
      smGetNamePoster : Begin Result := LoadImages (HTML); searchNextPage := false; End;
      end;

    // Перебираем следующие режимы, пока не найдем режим с непустой страницей
    if searchNextPage And (Result <> prListImage) then
      Begin
      Repeat
        Inc(Mode);
      until (Mode >= smFinished) Or (GetDownloadURL <> '');
      if Mode >= smFinished then
        Result := prFinished;
      End;
    end;
end;



{
История изменения скрипта загрузки изображений с сайта Кинопоиск
v0.0.0.1 от 22.02.2009
+ Реализована загрузка постеров со всех страниц.
+ Реализовано ограничение на количество загружаемых постеров. См. опцию
  maxPosters.
+ Реализована принудительная загрузка минимального количества постеров,
  несмотря на ограничения. См. опцию minPosters.
+ Реализовано ограничение на количество загружаемых страниц с постерами.
  См. опцию maxPages.
+ Реализована сортировка по размеру в пикселах: по возрастанию, по убыванию,
  по удалению от заданного. См. опции sort, rcmSizeX, rcmSizeY.
+ Реализована сортировка по размеру в байтах: по возрастанию, по убыванию,
  по удалению от заданного. См. опции sort, rcmSizeB.
+ Реализовано игнорирование постеров, больших или меньших заданного размера
  в пикселах или байтах. См. опции minSizeX, minSizeY, maxSizeX, maxSizeY,
  minSizeB, maxSizeB, minPosters.

v0.1.0.0 от 01.03.2009
+ Добавлена загрузка изображения с титульной страницы как одного из постеров.
  По техническим причинам его размер в байтах приравнивается к нулю.
+ Добавлена загрузка постеров оригинального размера. См. опцию loadOrigSize.
* При отсутствии найденных постеров теперь появляется сообщение
  "Фильмов не найдено".
+ Реализована пакетная загрузка постеров (будет работать только в версии
  PVD выше 0.9.9.4).

v0.1.1.0 от 14.03.2009
+ Добавлена загрузка обоев и фан-арта в поле постеров. См. опции loadCovers и
  loadFanArt. За информацию
  (http://www.videodb.info/forum_ru/index.php?topic=370.msg5224#msg5224)
  спасибо Resha.
+ В окно с результатами поиска добавлена идентификация типа постера (постер,
  обложка, фан-арт).
* Для унификации изменено описание скрипта на
  "[RU] Импортировать постеры из КиноПоиск.Ru".
* Внутренняя реализация работы с массивами постеров.
! При отсутствии постеров теперь не производится загрузка и анализ
  отсутствующей страницы с постерами.
! Исправлена работа с опцией loadMiniPoster = false. Теперь минипостер
  действительно не грузится.

v0.1.1.1 от 15.03.2009
! Исправлена неработоспособность скрипта при значении опции maxPages, не
  равном 1. За информацию
  (http://www.videodb.info/forum_ru/index.php?topic=370.msg5350#msg5350)
  спасибо Resha.

v0.1.1.2 от 05.04.2009
* Изменены внутренние константы для совместимости с версией 0.9.9.5.

v0.2.0.0 от 12.04.2009
+ Добавлена загрузка обоев.
+ Добавлена возможность использования конфигурационного файла. См. опцию
  pathToConfig. Теперь все пользовательские настройки, доступные для загрузки
  из конфигурационного файла, описаны в процедуре initOptions в начале скрипта.
  Опции можно устанавливать как в скрипте, так и в конфигурационном файле.
  Приоритет имеют опции из конфигурационного файла.
* Переработан алгоритм загрузки изображений для возможности загрузки разных
  типов изображений в одно поле.
* Переработан алгоритм загрузки изображений для возможности загрузки разных
  типов изображений в разном порядке.
! Изменен механизм получения адреса изображения. Теперь вместо формирования
  названия постера, что работало лишь в 90% случаев, название постера берется
  со страницы изображения.

v0.2.1.0 от 19.04.2009
+ Добавлена опция ограничения загрузки изображений разных пропорций. См. опцию
  proportion. Предложил
  (http://www.videodb.info/forum_ru/index.php?topic=370.msg6223#msg6223)
  NewSky. 
+ Добавлена возможность отображать количество и номер найденных изображений
  в окне с результатами поиска. См. опцию showCount. По умолчанию отключена.
  Предложил
  (http://www.videodb.info/forum_ru/index.php?topic=370.msg6223#msg6223)
  NewSky.
! При загрузке страницы с ошибкой теперь скрипт завершает работу.
! Исправлено зацикливание на некоторых изображениях. За информацию
  (http://www.videodb.info/forum_ru/index.php?topic=452.msg6236#msg6236)
  спасибо NewSky.

v0.2.1.1 от 26.04.2009
* Добавлена поддержка скриншотного типа скриптов, введённая в программе,
  начиная с версии 0.9.9.5 beta 2.
! Исправлена некорректная работа скрипта в версии 0.9.9.5 программы при значении
  packetLoad=true и установленном тихом режиме в настройках программы.

v0.2.1.2 от 14.07.2009
! Исправлена неработоспособность скрипта из-за изменений на сайте.

v0.2.1.3 от 13.09.2009
! Релизована возможность загрузки обложек.

v0.2.1.3.1 от 16.09.2009
! Исправлена ошибка с типом обложечного скрипта

v0.2.1.4 от 23.10.2009
* Внутренняя реализация, описания переменных, используемых при заливке скрипта
  на сайт PVD.

v0.2.1.5 от 22.11.2009
! Исправлены ошибки 11001/11004 при загрузке изображений из-за изменений
  на сайте.

v0.2.1.6 от 16.01.2010
! Исправлена загрузка изображений из-за изменений на сайте.

v0.2.1.7 от 23.01.2010
! Исправлена загрузка опций proportion и showCount из конфигурационного файла.
! Исправлено отсутствие загрузки минипостера.
! Исправлена загрузка изображений из-за изменений на сайте.

v0.2.1.8 от 28.03.2010
+ Добавлена возможность использовать относительные пути к файлу конфигурации.
! Исправлена ошибка формирования списка постеров

v0.2.1.9 от 03.06.2010
! Исправлена загрузка постеров.

v0.2.1.10 от 12.06.2010
! Исправлена обработка нескольких страниц с изображениями.

v0.2.1.11 от 08.07.2010
! Исправлен поиск первых страниц с изображениями.


Планы на будущее:
+ Реализовать задержку между загрузкой страниц
  (ЛС от 23 Ноября 2009, 10:33:42)
}
