Thanks.
Code: Select all
program IMDB;
uses
  StringUtils1;
  // ***** Manually set UserCountry to your required Classification Country below *****
const
  //UserCountry = '';
  { Delete the line above and remove the "//" in front of one the
    following lines, or add your country if it is not listed }
  UserCountry = 'Spain';
  //UserCountry = 'Canada';
  //UserCountry = 'Mexico';
  //UserCountry = 'Brazil';
  //UserCountry = 'Argentina';
  //UserCountry = 'Australia';
  //UserCountry = 'India';
  //UserCountry = 'Italy';
  //UserCountry = 'USA';
  //UserCountry = 'Portugal';
  //UserCountry = 'France';
  //UserCountry = 'Germany';
  //UserCountry = 'Netherlands';
  //UserCountry = 'UK';
  //UserCountry = 'Ireland';
  //UserCountry = 'Finland';
  //UserCountry = 'Norway';
  //UserCountry = 'Sweden';
  //UserCountry = 'Switzerland';
  BaseURL = 'http://www.filmaffinity.com';
  PopularTitleSearchURL =  'http://www.imdb.com/find?s=tt&q=';
  FullTitleSearchURL = 'http://www.imdb.com/find?s=tt&exact=true&q=';
  EpisodeTitleSearchURL = 'http://www.imdb.com/find?s=ep&q=';
 
var
  MovieName: string;
  MovieURL: string;
  MovieNumber: string;
  UpdateFile: TStringList;
 
function ConvertToASCII(AText: string): string;
begin
  Result := AText;
  if GetOption('ConvertToASCII') = 1 then
    Result := Cp1252ToASCII(AText);
end;
// ***** analyzes IMDB's results page that asks to select a movie from a list *****
procedure AnalyzeResultsPage(Address: string);
var
  PageText: string;
  Value: string;
begin
  PageText := ConvertToASCII(GetPage(Address));
  if pos('<title>Find - IMDb', PageText) = 0 then
    begin
      AnalyzeMoviePage(PageText)
    end else
    begin
      if Pos('<b>No Matches.</b>', PageText) > 0 then
        begin
          if GetOption('BatchMode') = 0 then
            ShowMessage('No movie found for this search.');
          Exit;
        end;
      if GetOption('BatchMode') = 0 then
        begin
          PickTreeClear;
          Value := TextBetween(PageText, '<h1 class="findHeader">Displaying', '</h1>');
          if Value <> '' then
          begin
            HTMLRemoveTags(Value);
            HTMLDecode(Value);
            PickTreeAdd(UTF8Decode(Value), '');
          end;
          Value := TextBetween(PageText, '<table class="findList">', '</table>');
          PageText := RemainingText;
          AddMovieTitles(Value);
          {
          Value := TextBefore(PageText, '"><b>more titles</b></a>', '<a href="');
          if Value <> '' then
            PickTreeMoreLink('http://www.imdb.com' + Value);
          if GetOption('EpisodeTitleSearch') > 0 then
            PickTreeMoreLink(EpisodeTitleSearchURL + UrlEncode(MovieName));
          }
          if PickTreeExec(Address) then
            AnalyzeResultsPage(Address);
        end
      else
        begin
          Value := TextBetween(PageText, '<td class="primary_photo">', '<img src');
          if Value <> '' then
         AnalyzeResultsPage('http://www.imdb.com' + TextBetween(Value, '<a href="', '"'));
        end;
    end;
end;
// ***** adds the movie titles found on IMDB's results page *****
function AddMovieTitles(List: string): Boolean;
var
  Value: string;
  Address: string;
begin
  Result := False;
  Value := TextBetween(List, '<td class="result_text">', '</td>');
  if GetOption('HideAkaTitles') = 1 then
    Value := StringReplace(Value, TextAfter(Value, '<br/>aka'), '')
  else
    Value := StringReplace(Value, 'aka', ' | aka');
  List := RemainingText;
  while Value <> '' do
  begin
    Address := TextBetween(Value, '<a href="/title/tt', '/');
    Address := Address + '/combined';
    HTMLRemoveTags(Value);
    HTMLDecode(Value);
    PickTreeAdd(UTF8Decode(Value), 'http://www.imdb.com/title/tt' + Address);
    Result := True;
    Value := TextBetween(List, '<td class="result_text">', '</td>');
    if GetOption('HideAkaTitles') = 1 then
      Value := StringReplace(Value, TextAfter(Value, '<br/>aka'), '')
    else
      Value := StringReplace(Value, 'aka', ' | aka');
     List := RemainingText;
  end;
end;
// ***** analyzes the page containing movie information *****
procedure AnalyzeMoviePage2(PageText: string);
var
  Value, Value2, Value3, FullValue, originalTitle: string;
  p, Count: Integer;
begin
  MovieNumber := TextBetween(PageText, '<input type="hidden" name="auto" value="legacy/title/tt', '/');
  if MovieNumber = '' then
    MovieNumber := TextBetween(PageText, '<input type="hidden" name="auto" value="legacy/title/tt', '/combined"');
  if MovieNumber = '' then
    MovieNumber := TextBetween(PageText, '<link rel="canonical" href="http://www.imdb.com/title/tt', '/');
// #########
//  if ((GetOption('AllActors') = 1) or (GetOption('Producer') = 1)) and (Pos('<div id="tn15" class="maindetails">', PageText) > 0) then
//    PageText := ConvertToASCII(GetPage('http://www.imdb.com/title/tt' + MovieNumber + '/combined'));
  if Pos('/combined"', TextBetween(PageText, '<link rel="canonical"', '/>')) = 0 then
    PageText := ConvertToASCII(GetPage('http://www.imdb.com/title/tt' + MovieNumber + '/combined'));
// #########
  MovieURL := 'http://imdb.com/title/tt' + MovieNumber;
  // OriginalTitle & Year
  if CanSetField(fieldOriginalTitle) or CanSetField(fieldYear) then
  begin
    originalTitle := TextBefore(PageText, '<i>(original title)', '<span class="title-extra">');
    HTMLDecode(originalTitle);
    Value := TextBetween(PageText, '<title>', '</title>');
   // showmessage(originalTitle);
   // showmessage(value);
    if (originalTitle <> '') and CanSetField(fieldOriginalTitle) then
      SetField(fieldOriginalTitle, FullTrim(originalTitle));
    p := Pos(' (1', Value);
    if p = 0 then
      p := Pos(' (2', Value);
    Value2 := Copy(Value, 0, p-1);
    Value := Copy(Value, p+2, Length(Value));
    HTMLDecode(Value2);
    if (originalTitle = '') and CanSetField(fieldOriginalTitle) then
      SetField(fieldOriginalTitle, FullTrim(Value2));
    if Pos('/', Value) > 0 then
      Value2 := TextBefore(Value, '/', '')
    else
      Value2 := TextBefore(Value, ')', '');
    if CanSetField(fieldYear) then
      SetField(fieldYear, Value2);
  end;
  // Director
  if CanSetField(fieldDirector) then
  begin
    Value := TextBetween(PageText, 'Directed by</a></h5>', '</table>');
    FullValue := '';
    Value2 := TextBetween(Value, '<a href="/name/', '</a>');
    while Value2 <> '' do
    begin
      Value := RemainingText;
      Value2 := TextAfter(Value2, '">');
      if FullValue <> '' then
        FullValue := FullValue + ', ';
      FullValue := FullValue + Value2;
      Value2 := TextBetween(Value, '<a href="/name/', '</a>');
    end;
    HTMLDecode(FullValue);
    SetField(fieldDirector, FullValue);
  end;
  // Actors
  if CanSetField(fieldActors) then
  begin
    Value := FullTrim(TextBetween(PageText, '<table class="cast">', '</table>'));
    if Value <> '' then
    begin
      FullValue := '';
      Count := 0;
      case GetOption('ActorsLayout') of
        0, 1:
          while Pos('<tr', Value) > 0 do
          begin
            Value2 := TextBetween(Value, '<tr', '</tr>');
            Value := RemainingText;
            if Pos('rest of cast', Value2) > 0 then
              Continue;
            if FullValue <> '' then
              FullValue := FullValue + #13#10;
            TextBefore(Value2, '</td>', '');
            Value2 := FullTrim(TextBetween(Value2, '<td class="nm">', '</td>'));
            HTMLRemoveTags(Value2);
            if Value2 <> '' then
            begin
              FullValue := FullValue + Value2;
              Count := Count + 1;
            end;
// ###
            if (Count = 15) and (GetOption('AllActors') = 0) then
              Break;
// ###
            if (Count = 10) and (GetOption('AllActors') = 2) then
              Break;
          end;
        2, 3:
          while Pos('<tr', Value) > 0 do
          begin
            Value2 := TextBetween(Value, '<tr', '</tr>');
            Value := RemainingText;
            if Pos('rest of cast', Value2) > 0 then
              Continue;
            if FullValue <> '' then
              FullValue := FullValue + #13#10;
            TextBefore(Value2, '</td>', '');
            Value2 := FullTrim(TextBetween(Value2, '<td class="nm">', '</td>'));
            HTMLRemoveTags(Value2);
            if Value2 <> '' then
            begin
              FullValue := FullValue + Value2;
              Value2 := FullTrim(TextBetween(RemainingText, '"char">', '</td>'));
              if Value2 <> '' then
                FullValue := FullValue + ' (as ' + Value2 + ')';
              Count := Count + 1;
// ###
              if (Count = 15) and (GetOption('AllActors') = 0) then
                Break;
// ###
              if (Count = 10) and (GetOption('AllActors') = 2) then
                Break;
            end;
          end;
        4:
          begin
            FullValue := Value;
            FullValue := StringReplace(FullValue, ' <tr><td align="center" colspan="4"><small>rest of cast listed alphabetically:</small></td></tr>', '');
            FullValue := StringReplace(FullValue, '>  <', '><');
            FullValue := StringReplace(FullValue, '</tr>', #13#10);
          end;
      end;
      HTMLRemoveTags(FullValue);
      HTMLDecode(FullValue);
      case GetOption('ActorsLayout') of
        0, 2:
          FullValue := StringReplace(FullValue, #13#10, ', ');
      end;
      SetField(fieldActors, FullValue);
    end;
  end;
  // Composer
  if CanSetField(fieldComposer) then
  begin   
    Value := TextBetween(PageText, 'Music by</a></h5>', '</table>');
    FullValue := '';
    Value2 := TextBetween(Value, '<a href="/name/', '</a>');
    while Value2 <> '' do
    begin
      Value := RemainingText;
      Value2 := TextAfter(Value2, '">');
      if FullValue <> '' then
        FullValue := FullValue + ', ';
      FullValue := FullValue + Value2;
      Value2 := TextBetween(Value, '<a href="/name/', '</a>');
    end;
    HTMLDecode(FullValue);
    SetField(fieldComposer, FullValue);
  end;
  
  // Cinematography
  begin
    Value := TextBetween(PageText, 'Cinematography by</a></h5>', '</table>');
    FullValue := '';
    Value2 := TextBetween(Value, '<a href="/name/', '</a>');
    while Value2 <> '' do
    begin
      Value := RemainingText;
      Value2 := TextAfter(Value2, '">');
      if FullValue <> '' then
        FullValue := FullValue + ', ';
      FullValue := FullValue + Value2;
      Value2 := TextBetween(Value, '<a href="/name/', '</a>');
    end;
    HTMLDecode(FullValue);
    SetCustomField('Fotografia', FullValue);
  end;
  
  // Costume Design
  begin
    Value := TextBetween(PageText, 'Costume Design by</a></h5>', '</table>');
    FullValue := '';
    Value2 := TextBetween(Value, '<a href="/name/', '</a>');
    while Value2 <> '' do
    begin
      Value := RemainingText;
      Value2 := TextAfter(Value2, '">');
      if FullValue <> '' then
        FullValue := FullValue + ', ';
      FullValue := FullValue + Value2;
      Value2 := TextBetween(Value, '<a href="/name/', '</a>');
    end;
    HTMLDecode(FullValue);
    SetCustomField('Vestuario', FullValue);
  end;
   // Film Editing
  begin
    Value := TextBetween(PageText, 'Film Editing by</a></h5>', '</table>');
    FullValue := '';
    Value2 := TextBetween(Value, '<a href="/name/', '</a>');
    while Value2 <> '' do
    begin
      Value := RemainingText;
      Value2 := TextAfter(Value2, '">');
      if FullValue <> '' then
        FullValue := FullValue + ', ';
      FullValue := FullValue + Value2;
      Value2 := TextBetween(Value, '<a href="/name/', '</a>');
    end;
    HTMLDecode(FullValue);
    SetCustomField('Montaje', FullValue);
  end;
  
  // Production Design
  begin
    Value := TextBetween(PageText, 'Production Design by</a></h5>', '</table>');
    FullValue := '';
    Value2 := TextBetween(Value, '<a href="/name/', '</a>');
    while Value2 <> '' do
    begin
      Value := RemainingText;
      Value2 := TextAfter(Value2, '">');
      if FullValue <> '' then
        FullValue := FullValue + ', ';
      FullValue := FullValue + Value2;
      Value2 := TextBetween(Value, '<a href="/name/', '</a>');
    end;
    
    Value := TextBetween(PageText, 'Set Decoration by</a></h5>', '</table>');
    Value2 := TextBetween(Value, '<a href="/name/', '</a>');
    while Value2 <> '' do
    begin
      Value := RemainingText;
      Value2 := TextAfter(Value2, '">');
      if FullValue <> '' then
        FullValue := FullValue + ', ';
      FullValue := FullValue + Value2;
      Value2 := TextBetween(Value, '<a href="/name/', '</a>');
    end;
    
    HTMLDecode(FullValue);
    SetCustomField('Diseno', FullValue);
  end;
  // Producer
  if CanSetField(fieldProducer) then
  begin
    Value := TextBetween(PageText, 'Produced by</a></h5>', '</table>');
    FullValue := '';
    Value2 := TextBetween(Value, '<a href="/name/', '</a>');
    while Value2 <> '' do
    begin
      Value := RemainingText;
      Value2 := TextAfter(Value2, '">');
      if FullValue <> '' then
        FullValue := FullValue + ', ';
      FullValue := FullValue + Value2;
      Value2 := TextBetween(Value, '<a href="/name/', '</a>');
    end;
    HTMLDecode(FullValue);
    SetField(fieldProducer, FullValue);
  end;
  // Writer
  if CanSetField(fieldWriter) then
  begin   
    Value := TextBetween(PageText, 'Writing credits</a></h5>', '</table>');
    FullValue := '';
    Value2 := TextBetween(Value, '<a href="/name/', '</a>');
    while Value2 <> '' do
    begin
      Value := RemainingText;
      Value2 := TextAfter(Value2, '">');
      if FullValue <> '' then
        FullValue := FullValue + ', ';
      FullValue := FullValue + Value2;
      Value2 := TextBetween(Value, '<a href="/name/', '</a>');
    end;
    HTMLDecode(FullValue);
    SetField(fieldWriter, FullValue);
  end;
  // AKA Name
  if CanSetField(fieldTranslatedTitle) then
  begin
    FullValue := ConvertToASCII(GetPage(MovieURL+'/releaseinfo#akas'));
    FullValue := TextBetween(FullValue, '<a id="akas" name="akas">', '</table>');
    FullValue := RemoveSpaces(FullValue, True);
    FullValue := StringReplace(FullValue, #13, '');
    FullValue := StringReplace(FullValue, #10, '');
    FullValue := StringReplace(FullValue, '> <', '><');
    FullValue := StringReplace(FullValue, '<tr class="even">', '<tr>');
    FullValue := StringReplace(FullValue, '<tr class="odd">', '<tr>');
    if RegExprSetExec('</td>\s*<tr>', FullValue) then
      // removing the original title
      FullValue := '<tr>'+TextAfter(FullValue, '</td><tr>');
    while fullvalue <> '' do
    begin
  //   showMessage('Analysing: '+FullValue);
    // each line is a pair of  translated title and country
    // format: <tr><td>country</td><td>Translated title</td><tr>
      value2 := TextBetween(FullValue, '<tr>', '</tr>');
    // showMessage('Line: '+value2);
      value := TextBetween(Value2, '<td>', '</td>');
      value2 := TextAfter(Value2, '</td>');
      value2 := TextBetween(Value2, '<td>', '</td>');
      HTMLDecode(value2);
   //  showMessage('Translated: '+value+' into '+value2);
      if pos(UserCountry, value) > 0 then
      begin
        HTMLDecode(Value2);
        SetField(fieldTranslatedTitle, FullTrim(UTF8Decode(Value2)));
        FullValue := '';
      end
      else  FullValue := TextAfter(FullValue, '</tr>');
    end;
 {
    if Value <> '' then
    begin
      Value := StringReplace(Value, 'See more', '');
      Value := StringReplace(Value, '»', '');
      Value := FullTrim(StringReplace(Value, '<br>', ', '));
      HTMLRemoveTags(Value);
      HTMLDecode(Value);
      Value := FullTrim(Value);
      if Value <> '' then
        if StrGet(Value, Length(Value)) = ',' then
          Delete(Value, Length(Value), 1);
      SetField(fieldTranslatedTitle, Value)
   end;
   }
  end;
end;
// ***** Imports lists like Genre, Country, etc. depending of the selected option *****
function ImportList(PageText: string; MultipleValues: Integer; StartTag: string): string;
var
  Value, Value2: string;
begin
  if MultipleValues = 0 then
  begin
    Value := TextBetween(PageText, StartTag, '</a>');
    Value2 := TextAfter(Value, '">');
  end
  else
  begin
    Value := TextBetween(PageText, StartTag, '</div>');
    Value2 := TextBefore(Value, '<a class="tn15more inline"', '');
    if Value2 = '' then
      Value2 := Value;
    Value2 := TextAfter(Value2, '">');
    HTMLRemoveTags(Value2);
    if MultipleValues = 1 then
      Value2 := StringReplace(Value2, ' | ', ', ');
    if MultipleValues = 2 then
      Value2 := StringReplace(Value2, ' | ', ' / ');
    if MultipleValues = 3 then
      Value2 := '';
  end;
  Value2 := StringReplace(Value2, #13#10, '');
  Value2 := StringReplace(Value2, ' , ', ', ');
  HTMLDecode(Value2);
  Result := FullTrim(Value2);
end;
//------------------------------------------------------------------------------------ 
function LineDecode(S: string):string; 
begin 
   S:= UTF8Decode(S); 
   HTMLDecode(S); 
   Result := S; 
end; 
//------------------------------------------------------------------------------------ 
function FindLine2(Pattern: string; List: TStringList; StartAt: Integer): Integer;
var 
   i: Integer; 
begin 
   Result := -1; 
   if StartAt < 0 then StartAt := 0; 
   for i := StartAt to List.Count-1 do 
      if Pos(Pattern, List.GetString(i)) <> 0 then 
      begin 
         Result := i; 
         Break; 
      end; 
end; 
//------------------------------------------------------------------------------------ 
// 
//  ConvertAlphaNum: Quita todo menos letras (mayusculas y minusculas) y numeros 
// 
Function ConvertAlphaNum(s: string) : string; 
var 
  i: Integer; 
  s2, ch: string; 
begin 
  s2 := ''; 
  For i := 1 To Length(s) do 
    begin 
      ch := copy(s, i, 1); 
      if ((ch >= 'a') and (ch <= 'z')) or ((ch >= '0') and (ch <= '9')) or ((ch >= 'A') and (ch <= 'Z'))  then 
      s2 := s2 + ch; 
    end; 
  result := s2; 
end; 
//-------------------------------------- 
function TextBetween2(S: string; StartTag: string; EndTag: string): string;
var 
   ini, fin, lenS: Integer; 
begin 
   Result := ''; 
   lenS := Length(S); 
   ini := Pos(StartTag, S); 
   if ini <> 0 then 
   begin 
      ini := ini + Length(StartTag); 
      S:= Copy(S,ini,lenS-ini+1); 
      ini:=1; 
      fin := Pos(EndTag, S); 
      if (fin <> 0) and (fin > ini) then 
          Result := Copy(S, ini, fin - ini); 
   end; 
end; 
//------------------------------------------------------------------------------------ 
function TextAfter2(S: string; StartTag: string): string;
var 
  ini: Integer; 
begin 
  ini := Pos(StartTag, S); 
  if ini <> 0 then 
     Result := Copy(S, ini + Length(StartTag), Length(S)-ini+1) 
  else 
     Result := ''; 
end; 
//------------------------------------------------------------------------------------ 
function DeleteTags(S: string): string; 
var 
   n, len, tag: Integer; 
   c, p: char; 
begin 
   len    := Length(S); 
   tag    := 0; 
   p      := ' '; 
   Result := ''; 
   for n := 1 to len do 
   begin 
      c := Copy(S,n,1); 
      // Eliminamos los tabuladores 
      if c = #9 then c := ' '; 
      // Los espacios redundantes no se procesan 
      if (c <> ' ') or (p <> ' ') then 
      begin 
         // Eliminamos los tags de HTML 
         if tag = 0 then 
         begin 
            if c <> '<' then 
            begin 
               Result := Result + c; 
               p := c; 
            end 
            else tag := 1; 
         end 
         else if c = '>' then tag := 0; 
      end; 
   end 
   if p = ' ' then Result := Copy(Result, 1, Length(Result) - 1); 
end; 
//------------------------------------------------------------------------------------ 
//------------------------------------------------------------------------------------ 
// FUNCIONES DE CARTELESPELICULAS 
// 
// Función que suprime los acentos
// 
function Sinacento(Conacento : String): String; 
var 
  Acento, Noacento : String; 
  i : integer; 
begin 
  Acento := 'ÀÃÂÂÃÄÅàáâãäåÒÓÃâ€Ãƒâ€¢Ãƒâ€“ØòóôõöøÈÉÊËèéêëÌÃÂÃŽÃÂìÃÂîïÙÚÛÜùúûüÿ'; 
  Noacento := 'AAAAAAaaaaaaOOOOOOooooooEEEEeeeeIIIIiiiiUUUUuuuuy'; 
 for i := 1  to Length(Acento) do 
    Conacento := StringReplace(Conacento,copy(Acento, i, 1),copy(Noacento, i, 1)); 
  result := Conacento; 
end; 
// 
// Función para convertir a ascii
// 
function Caracter(str1: string) : string; 
begin 
  str1 := StringReplace(str1, 'á' , 'á'); 
  str1 := StringReplace(str1, 'é' , 'é'); 
  str1 := StringReplace(str1, 'ÃÂÂ' , 'ÃÂ'); 
  str1 := StringReplace(Str1, 'ó' , 'ó'); 
  str1 := StringReplace(str1, 'ú' , 'ú'); 
  str1 := StringReplace(str1, 'ñ' , 'ñ'); 
  str1 := StringReplace(str1, 'É' , 'É'); 
  str1 := StringReplace(str1, 'Ã?' , 'ÃÂ'); 
  str1 := StringReplace(str1, 'Ó' , 'Ó'); 
  str1 := StringReplace(str1, 'Ú' , 'Ú'); 
  str1 := StringReplace(str1, 'Ñ' , 'Ñ'); 
  str1 := StringReplace(str1, 'Â'  ,  ''); 
  str1 := StringReplace(str1, 'â' , 'â'); 
  str1 := StringReplace(str1, 'ê' , 'ê'); 
  str1 := StringReplace(str1, 'î' , 'î'); 
  str1 := StringReplace(str1, 'ô' , 'ô'); 
  str1 := StringReplace(str1, 'û' , 'û'); 
  str1 := StringReplace(str1, 'è' , 'è'); 
  str1 := StringReplace(str1, 'ì' , 'ì'); 
  str1 := StringReplace(str1, 'ò' , 'ò'); 
  str1 := StringReplace(str1, 'ù' , 'ù'); 
  str1 := StringReplace(str1, 'ä' , 'ä'); 
  str1 := StringReplace(str1, 'ë' , 'ë'); 
  str1 := StringReplace(str1, 'ï' , 'ï'); 
  str1 := StringReplace(str1, 'ö' , 'ö'); 
  str1 := StringReplace(str1, 'ü' , 'ü'); 
  str1 := StringReplace(str1, 'ÃÂÂ' , 'ÃÂ'); 
  str1 := StringReplace(str1, 'Ã' ,  'à'); 
  str1 := StringReplace(str1, 'Â¥' ,  'Ã¥'); 
  str1 := StringReplace(str1 , '“' , '"'  ); 
  str1 := StringReplace(str1 , 'â€Â' , '"'  ); 
  str1 := StringReplace(str1 , '’' , '''' ); 
  str1 := StringReplace(str1 , '‘' , '''' ); 
  str1 := StringReplace(str1 , '&'   , '&'  ); 
  str1 := StringReplace(str1 , '–' , '-'  ); 
  str1 := StringReplace(str1 , '&'  , '&'  ); 
  str1 := StringReplace(str1 , '″' , '"'  ); 
  str1 := StringReplace(str1 , '…' , '...'); 
  str1 := StringReplace(str1 , ' ' , ''); 
//  Str1 := Sinacento (Str1); 
  result := str1; 
end; 
// 
// Funcion que borra signos y quita acentos 
// 
function PreparaTitulo(T: string): string; 
var 
  i: Integer; 
begin 
  HTMLDecode(result); 
  result := AnsiLowerCase(T); 
  result := StringReplace(result, chr(146), ''); 
  result := StringReplace(result, chr(39), ''); 
  result := StringReplace(result, '´', ''); 
  result := StringReplace(result, '`', ''); 
  result := StringReplace(result, '"', ''); 
  result := StringReplace(result, '¿', ''); 
  result := StringReplace(result, '?', ''); 
  result := StringReplace(result, '¡', ''); 
  result := StringReplace(result, '!', ''); 
  result := StringReplace(result, '.', ''); 
  result := StringReplace(result, ':', ''); 
  result := StringReplace(result, ';', ''); 
  //result := StringReplace(result, '-', ''); 
  result := StringReplace(result, '/', ''); 
  result := StringReplace(result, '\', ''); 
  result := StringReplace(result, '_', ''); 
  result := StringReplace(result, 'á', 'a'); 
  result := StringReplace(result, 'ÃÂ', 'a'); 
  result := StringReplace(result, 'À', 'a'); 
  result := StringReplace(result, 'é', 'e'); 
  result := StringReplace(result, 'ÃÂ', 'i'); 
  result := StringReplace(result, 'ó', 'o'); 
  result := StringReplace(result, 'ú', 'u'); 
  result := StringReplace(result, 'ä', 'a'); 
  result := StringReplace(result, 'ë', 'e'); 
  result := StringReplace(result, 'ï', 'i'); 
  result := StringReplace(result, 'ö', 'o'); 
  result := StringReplace(result, 'ü', 'u'); 
  result := StringReplace(result, '–', '-'  ); 
  result := StringReplace(result, '…', '...'); 
  result := Caracter (result); 
end; 
// PROCEDIMIENTOS DE CARTELES PELICULAS 
// 
// Crea la lista de las peliculas que contengan el titulo introducido 
// 
procedure PaginasCartelesPeliculas (Titulo: string); 
var 
  CPPage : TStringList; 
  Line, PageWeb, TitleWeb, Encontrado, SwFin, TitleWebSin, Any, PageWebList : string; 
  LineNr, ContPagina, i, j,  PosAny : Integer; 
begin 
    Encontrado := '0';  // Si encontrado = '0' es que no se encuentra la pelicula 
    PickTreeClear; 
    PickTreeAdd('Resultados de la búsqueda para "' + Titulo + '" (www.CartelesPeliculas.com):', '');
    Titulo := UrlEncode (Titulo); 
    PageWeb := 'http://www.cartelespeliculas.com/wp/?s=' + titulo;        // Se crea la URL para ver todas las peliculas que contengan el texto introducido 
    CPPage := TStringList.Create; 
    CPPage.Text := GetPage(PageWeb); 
    CPPage.Text := Caracter (CPPage.Text); 
    LineNr := 1; 
    SwFin := '0'; 
    ContPagina := 1; 
    Repeat                                                               // Para cada pelicula que contenga el texto mira a ver si coincide con el titulo 
        If FindLine ('bookmark' , CPPage , LineNr) > 0 then              // Puede haber coincidencias con otros campos de la web (Sinopsis, ...) 
          begin 
            LineNr := FindLine('bookmark', CPPage, LineNr); 
            Line  := CPPage.GetString(LineNr); 
            TitleWeb := TextBetween (Line, 'bookmark">' , '<');          // Estrae el titulo 
            LineNr := LineNr + 1; 
            TitleWebSin := Sinacento(Titleweb); 
            Titulo := UrlDecode (Titulo); 
            TitleWebSin  := PreparaTitulo(TitleWebSin); 
            PageWebList := TextBetween (Line, '<a href="' , '" rel="');    // Extrae la direccion Web 
            if Pos(AnsiLowerCase(Titulo), TitleWebSin) > 0 then                           // Verifica si el titulo de la web coincide con el texto 
              begin 
                LineNr := FindLine('quick-read-more', CPPage, LineNr); 
                Line  := CPPage.GetString(LineNr); 
                Delete (Line, 1, 4); 
                For i := 1 to 5 do                                         // Extrae el año para mostrar en la PickList 
                  begin 
                    PosAny := Pos(',' , Line); 
                    Any := Copy (Line, PosAny - 4 , 4); 
                    If (Any > '0000') and (Any < '9999') then 
                      begin 
                        Any:= ' (' + Any + ')'; 
                        break 
                      end 
                    else 
                      begin 
                        Any := ''; 
                        Delete (Line , PosAny, 1); 
                        end; 
                  end; 
                PickTreeAdd(TitleWeb + Any, PageWebList);                   // Añade el titulo, año y direccion Web 
                Encontrado := '1'; 
              end 
            else                                                            //si no coincide el titulo miramos el primer AKAS 
                begin 
                    LineNr := LineNr - 1; 
                    LineNr := FindLine('akas', CPPage, LineNr); 
                    Line  := CPPage.GetString(LineNr); 
                    TitleWeb := TextBetween (Line, 'alt="akas: ' , ',');          // Estrae el titulo 
                    LineNr := LineNr + 1; 
                    TitleWebSin := Sinacento(Titleweb); 
                    Titulo := UrlDecode (Titulo); 
                    TitleWebSin  := PreparaTitulo(TitleWebSin); 
                    PageWebList := TextBetween (Line, '<a href="' , '" rel="');    // Extrae la direccion Web 
                    if Pos(AnsiLowerCase(Titulo), TitleWebSin) > 0 then                           // Verifica si el titulo de la web coincide con el texto 
                        begin 
                            LineNr := FindLine('quick-read-more', CPPage, LineNr); 
                            Line  := CPPage.GetString(LineNr); 
                            Delete (Line, 1, 4); 
                            For i := 1 to 8 do                                         // Extrae el año para mostrar en la PickList 
                              begin 
                                PosAny := Pos(',' , Line); 
                                Any := Copy (Line, PosAny - 4 , 4); 
                                If (Any > '0000') and (Any < '9999') then 
                                  begin 
                                    Any:= ' (' + Any + ')'; 
                                    break 
                                  end 
                                else 
                                  begin 
                                    Any := ''; 
                                    Delete (Line , PosAny, 1); 
                                  end; 
                              end; 
                        PickTreeAdd(TitleWeb + Any, PageWebList);                   // Añade el titulo, año y direccion Web 
                        Encontrado := '1'; 
                        end 
                    else 
                        begin 
                            SwFin:= '1'; 
                        end 
                end 
        end 
        else 
          begin 
            If FindLine ('Entradas Anteriores' , CPpage, LineNr) > 0 then    // Si 'Entradas Anteriores' es que hay mas paginas con coincidencia 
              begin 
                ContPagina := ContPagina + 1; 
                Titulo := UrlEncode (Titulo); 
                PageWeb := 'http://www.cartelespeliculas.com/wp/page/' + (inttostr(ContPagina)) + '/?s=' + titulo; 
                CPPage := TStringList.Create;                                // Lee las paginas con coincidencia 
                CPPage.Text := GetPage(PageWeb); 
                CPPage.Text := Caracter (CPPage.Text); 
                LineNr := 1; 
              end 
            else 
              begin 
                SwFin := '1'; 
              end; 
          end; 
     until (SwFin = '1'); 
    if (Encontrado = '1') then 
      begin 
        PickTreeSort; 
        if PickTreeExec(pageweb) then                                    // Selecciona que nos interese y va a buscar la caratula 
          begin 
            AnalyzeCoverPage (PageWeb); // Muestra los carteles seleccionados 
          end 
      end 
   else 
     ShowMessage('Titulo ' + Titulo + ' no encontrado en CartelesPeliculas'); 
end; 
// 
// Caratula. 
// 
//Accede a la web para extraer la caratula, Primero va a una web intermedia y despues accede a la caratula 
// 
procedure AnalyzeCoverPage(PageWeb: string); 
var 
   Page: TStringList; 
   LineNr : Integer; 
   Line : string; 
begin 
   Page := TStringList.Create;                                        // Accede a la Web donde están todas las caratulas y los datos de la pelicula 
   Page.Text := GetPage(PageWeb); 
   RemovePicture; 
   LineNr := 1; 
   If FindLine ('./../../pgrande3' , Page , LineNr) > 0 then 
     begin 
       LineNr := FindLine('./../../pgrande3', Page, LineNr); 
       Line  := Page.GetString(LineNr); 
       PageWeb := TextBetween (Line, '<a href="./../../' , '" target');    // Forma la Web con la primera caratula que encuentra 
       PageWeb := 'http://www.cartelespeliculas.com/' + PageWeb; 
       PageWeb := StringReplace(pageWeb , 'amp;'   , '&'  ); 
       Page.Free 
       Page := TStringList.Create;                                         // Accede a la Web intermedia 
       Page.Text := GetPage(PageWeb); 
       LineNr := 1; 
       LineNr := FindLine('galeria/albums/', Page, LineNr); 
       If FindLine ('galeria/albums/' , Page , LineNr) > 0 then 
         begin 
           Line  := Page.GetString(LineNr); 
           PageWeb := TextBetween (Line, 'id="imagen" src="' , '" width'); // Forma la Web donde esta la caratula 
           PageWeb := 'http://www.cartelespeliculas.com/' + PageWeb; 
           Getpicture (PageWeb);                                           // EnvÃÂa la caratula al programa. 
         end 
       else 
         ShowMessage('Titulo no encontrado en CartelesPeliculas') 
     end 
   else 
     ShowMessage('Titulo no encontrado en CartelesPeliculas'); 
end; 
//------------------------------------------------------------------------------------ 
//------------------------------------------------------------------------------------ 
procedure AnalyzePage(Address: string); 
var 
   Page: TStringList; 
   LineNr: Integer; 
   Line: string; 
   Count: Integer; 
   MovieTitle, MovieAddress, Title: string; 
begin 
   Count := 0; 
   Page  := TStringList.Create; 
   Page.Text := GetPage(Address); 
   PickTreeClear; 
   // Get how much search results have been found 
   // No encuentra las palabras "Resultados por tÃÂtulo"¿?, busco la 
   // linea anterior, y cojo la siguiente linea, le quito los espacios 
   // y me quedo con el numerode peliculas. 
   LineNr := FindLine('<div class="sub-header-search">', Page, 0); 
   if LineNr <> -1 then 
   begin 
      LineNr := LineNr + 1; 
      Line   := Page.GetString(LineNr); 
      Line:= DeleteTags(Line); 
      Line:= ConvertAlphaNum(Line); 
      Count := StrToInt(Line,0); 
   end; 
   // Add the results to the PickTree 
   if Count = 0 then 
      ShowMessage('No se ha encontrado ningún registro') 
   else 
   begin 
      LineNr := 0; 
      while true do 
      begin 
         LineNr := FindLine('<div class="mc-title"><a href="', Page, LineNr + 1); 
         if LineNr = -1 then 
         begin 
            LineNr := FindLine('siguientes >>', Page, 0); 
            if LineNr = -1 then 
               break; 
            Line      := Page.GetString(LineNr); 
            Page.Text := GetPage('http://www.filmaffinity.com/es/search.php' + TextBetween(Line, '<a href="search.php', '"><div class="')); 
            LineNr    := 0; 
            continue; 
         end; 
         Line         := Page.GetString(LineNr); 
         MovieAddress := TextBetween(Line, '<div class="mc-title"><a href="', '.html">') + '.html'; 
         MovieTitle:= TextBetween(Line, '.html">', '<img src="'); 
         MovieTitle:= DeleteTags(MovieTitle); 
         MovieTitle:= LineDecode(MovieTitle); 
         if (Length(MovieAddress) <> 0) and (Length(MovieTitle) <> 0) then 
            PickTreeAdd(MovieTitle, BaseURL + MovieAddress); 
      end; 
      if ((Count = 1) and (GetOption('DontAsk') = 1)) then 
         AnalyzeMoviePage(BaseURL + MovieAddress)
      else 
      begin 
// 
//         PickTreeSort;      // Si se quiere clasificar por orden alfabetico hay que activar el PickTreeSort, quitar las 2 
//                            // las 2 barras "//" que hay a la izquierda la instrucción PickTreeSort y ya esta. 
// 
         PickTreeExec(Address); 
         AnalyzeMoviePage(Address);
           Title := GetField(fieldTranslatedTitle); 
           if Title = '' then 
            Title := GetField(fieldOriginalTitle); 
                Title := PreparaTitulo(Title); 
           if Input('Importar de CartelesPeliculas', 'Por favor, introduce el titulo:', Title) then 
                    PaginasCartelesPeliculas(Title); 
      end 
   end; 
   Page.Free; 
end; 
//------------------------------------------------------------------------------------ 
procedure AnalyzeMoviePage(Address: string);
var 
   Page: TStringList; 
   LineNr, LineInc: Integer; 
   Line: string; 
   Item: string; 
   Comments: string; 
   CharStar: string; 
begin 
   Comments := ''; 
   Page := TStringList.Create; 
   Page.Text := GetPage(Address); 
   // Rating 
   LineNr := FindLine2('<div id="movie-rat-avg" itemprop="ratingValue">', Page, LineNr);
   if LineNr <> -1 then 
   begin 
      Line := Page.GetString(LineNr + 1); 
      Item := DeleteTags(Line); 
      Item:= LineDecode(Item); 
      SetField(fieldRating, StringReplace(Item, ',', '.')); 
   end; 
   // Year 
   LineNr := FindLine2(UTF8Encode('<dt>Año</dt>'), Page, LineNr);
   if LineNr <> -1 then 
   begin 
      Line := Page.GetString(LineNr + 1); 
      Item := DeleteTags(TextBetween2(Line, '<dd>', '</dd>'));
      Item:= LineDecode(Item); 
      SetField(fieldYear, Item); 
   end; 
   // Length 
   LineNr := FindLine2(UTF8Encode('<dt>Duración</dt>'), Page, LineNr);
   if LineNr <> -1 then 
   begin 
      Line := Page.GetString(LineNr + 1); 
      Item := DeleteTags(TextBetween2(Line, '<dd>', 'min.</dd>'));
      Item:= LineDecode(Item); 
      SetField(fieldLength, Item); 
   end; 
   // Country 
   LineNr := FindLine2(UTF8Encode('<dt>País</dt>'), Page, LineNr);
   if LineNr <> -1 then 
   begin 
      Line := Page.GetString(LineNr + 1); 
      Item := DeleteTags(TextBetween2(Line, 'title="', '"></span'));
      Item:= LineDecode(Item); 
      SetField(fieldCountry, Item); 
   end; 
   // Productor 
   LineNr := FindLine2(UTF8Encode('<dt>Productora</dt>'), Page, LineNr);
   if LineNr <> -1 then 
   begin 
      Line := Page.GetString(LineNr + 1); 
      Item := DeleteTags(TextBetween2(Line, '<dd>', '</dd>'));
      Item:= LineDecode(Item);
      Item := StringReplace(Item, ' / ', ', ');
      SetCustomField('Productora', Item);
   end; 
   // Category 
   LineNr := FindLine2(UTF8Encode('<dt>Género</dt>'), Page, LineNr);
   if LineNr <> -1 then 
   begin 
      Line := Page.GetString(LineNr + 2); 
      Item := DeleteTags(Line); 
      Item := LineDecode(Item);
      Item := StringReplace(Item, '. ', ', '); 
      SetField(fieldCategory, Item); 
   end; 
   // Synopsis 
   LineNr := FindLine2(UTF8Encode('<dt>Sinopsis</dt>'), Page, LineNr);
   if LineNr <> -1 then 
   begin 
      Line := Page.GetString(LineNr + 1); 
      Item := DeleteTags(Line); 
      Item:= LineDecode(Item); 
      SetField(fieldDescription, Item); 
   end; 
   // Awards 
   LineNr := FindLine2(UTF8Encode('<dt>Premios</dt>'), Page, LineNr);
   if LineNr <> -1 then 
   begin 
      LineNr   := LineNr + 1; 
      Line     := Page.GetString(LineNr);
      if ((CheckVersion(4,2,0) = true) and (GetOption('Force350') = 0)) then SetCustomField('Premios', Item)
      else Comments := Comments + 'Premios: ' + #13#10;
      while Pos ('</dd>', Line) = 0 do 
      begin 
         if Pos ('<span id="show-all-awards">', Line) = 0 then 
         begin 
            Item := DeleteTags(Line); 
            Item:= LineDecode(Item);
            
            if (Length(Item) <> 0) then 
            begin
               if ((CheckVersion(4,2,0) = true) and (GetOption('Force350') = 0)) then SetCustomField('Premios', Item)
               else Comments := Comments + '  - ' + Item + #13#10;
            end; 
         end; 
         LineNr := LineNr + 1; 
         Line   := Page.GetString(LineNr); 
      end;
      Comments := Comments + #13#10;
   end; 
   // Critic 
   LineNr := FindLine2(UTF8Encode('<dt>CrÃticas</dt>'), Page, LineNr);
   if LineNr <> -1 then 
   begin 
      // El unico objeto de esta linea es poder presentar en el foro el listado 
      // del script sin que se produzca la conversión del caracter estrella
      CharStar       := '&'+'#9733;' ; 
      Comments := Comments + 'CrÃticas: ' + #13#10 + #13#10;
      LineNr := FindLine2('<div class="pro-review">', Page, LineNr + 1);
      while LineNr <> -1 do 
      begin 
         LineNr := LineNr + 1; 
         Line := Page.GetString(LineNr); 
         if Pos (UTF8Encode('<a title="Leer crÃtica completa" href='), Line) <> 0 then
         begin 
            LineNr := LineNr + 1; 
            Line := Page.GetString(LineNr); 
         end; 
         Line:= StringReplace(Line, CharStar, '*'); 
         Item := DeleteTags(Line); 
         Item:= LineDecode(Item); 
         if (Length(Item) <> 0) then 
         begin 
            Comments := Comments + Item + #13#10; 
            LineNr := FindLine2('<div class="pro-crit-med">', Page, LineNr + 1);
            Line := Page.GetString(LineNr); 
            Item := DeleteTags(Line); 
            Item:= LineDecode(Item); 
            if (Length(Item) <> 0) then 
            begin 
               Comments := Comments + Item + #13#10; 
            end; 
            Comments := Comments + '________________________________________' + #13#10 + #13#10; 
         end; 
         LineNr := FindLine('<div class="pro-review">', Page, LineNr + 1); 
      end; 
   end; 
   HTMLDecode(Comments); 
   SetField(fieldComments, Comments); 
   if GetOption('DontWantExtras') = 0 then 
      AnalyzeExtras(Page,Address); 
end; 
//------------------------------------------------------------------------------------ 
begin 
   if (CheckVersion(4,1,2) = false) then 
   begin 
      ShowMessage('Se requiere Ant Movie Catalog versión 4.1.2 o superior');
      exit; 
   end; 
   if (CheckVersion(4,2,0) = false) then 
      SetOption('DontWantExtras', 1); 
   MovieName := GetField(fieldOriginalTitle); 
   if Length(MovieName) = 0 then 
      MovieName := GetField(fieldTranslatedTitle); 
   if GetOption('DontAsk') = 0 then 
      Input('FilmAffinity', 'Pelicula:', MovieName); 
   MovieName := UTF8Encode(MovieName); 
   if Pos('filmaffinity.com', MovieName) > 0 then 
      AnalyzeMoviePage(MovieName)
   else 
      AnalyzePage(BaseURL +'/es/search.php?stext=' + UrlEncode(MovieName) + '&stype=Title'); 
        // ***** beginning of the program *****
  // Check for current AMC version
  if CheckVersion(4,2,0) then
  begin
    MovieName := '';
    if GetOption('BatchMode') = 2 then
    begin
      MovieName := GetField(fieldURL);
      if Pos('imdb.com', MovieName) = 0 then
        MovieName := '';
    end;
    if MovieName = '' then
      MovieName := GetField(fieldOriginalTitle);
    if MovieName = '' then
      MovieName := GetField(fieldTranslatedTitle);
    if GetOption('BatchMode') = 0 then
    begin
      if not Input('IMDB Import', 'Enter the title or the IMDB URL of the movie:', MovieName) then
        Exit;
    end
    else
      Sleep(500);
    if MovieName <> '' then
    begin
      if Pos('imdb.com', MovieName) > 0 then
        AnalyzeResultsPage(MovieName)
      else if RegExprSetExec('tt[0-9]+', moviename) then
        AnalyzeResultsPage('http://www.imdb.com/title/' + MovieName)
      else
      begin
        MovieName := UTF8Encode(StringReplace(MovieName, '&', 'and'));
        if (GetOption('BatchMode') > 0) or (GetOption('PopularSearches') = 1) then
          AnalyzeResultsPage(PopularTitleSearchURL + UrlEncode(MovieName))
        else
          AnalyzeResultsPage(FullTitleSearchURL + UrlEncode(MovieName));
      end;
    end;
  end
  else
    ShowMessage('This script requires a newer version of Ant Movie Catalog (at least the version 4.2)');
end.

