FilmAffinity (ES): New version 'reviewed'

If you made a script you can offer it to the others here, or ask help to improve it. You can also report here bugs & problems with existing scripts.
Post Reply
aviloria
Posts: 24
Joined: 2006-11-08 11:52:28

FilmAffinity (ES): New version 'reviewed'

Post by aviloria »

Hola a todos,

He revisado la última versión del script para corregir un par de cosas:
- Ahora funciona correctamente el modo DontAsk (proceso batch -o por lotes- de las películas) [gracias Kreti]
- Ahora carga correctamente las imágenes aunque no tengan un poster grande [gracias Kreti]
- Ahora la sección 'Premios' de la página se incluye en los comentarios [gracias Félix A. del Blanco]
- Reordenación del código para optimizar la carga de información.

Espero vuestros comentarios.
Que os guste!

--------------------------------------------

Hi all,

I have reviewed the latest version of the script to fix some bugs and add new features:
- 'DontAsk' mode works again! (batch process of the films) [thanks Kreti]
- Now thie script also loads images that haven't enlarge version (posters) [thanks Kreti]
- Now the 'Awards' section (changed in the website) is loaded into the Comments field [thanks Félix A. del Blanco]
- Some code optimizations to process faster the pages

I'm on hold for your comments
Enjoy it!

Code: Select all

(***************************************************

Ant Movie Catalog importation script
www.antp.be/software/moviecatalog/

[Infos]
Authors=aviloria  (aviloria@yahoo.com) modded by: rodpedja (rodpedja@gmail.com), kreti (bisoft@hotmail.com), MrK, gilistico
Title=FilmAffinity (ES)
Description=Movie importation script for FilmAffinity Spain
Site=http://www.filmaffinity.com
Language=ES
Version=2.48
Requires=3.5.0
Comments=Updated: Script option for batch running (default disabled), and now it gets the category.
License=The source code of the script can be used in another program only if full credits to script author and a link to Ant Movie Catalog website are given in the About box or in the documentation of the program.|
GetInfo=1

[Options]
DontAsk=1|0|1=Método rápido: No te pregunta el titulo al principio, ni te pide confirmar si sólo hay un resultado|0=Método lento: Confirmas la información manualmente

***************************************************)

program FilmAffinity;
const
   BaseURL1 = 'http://www.filmaffinity.com';
var
   MovieName: string;
   MovieURL: string;
   
//------------------------------------------------------------------------------------

function FindLine(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;

//------------------------------------------------------------------------------------

function TextBetween(var S: string; StartTag: string; EndTag: string): string;
var
   InitialPos: Integer;
begin
   InitialPos := Pos(StartTag, S);
   if InitialPos = 0 then
      result := ''
   else
   begin
      Delete(S, 1, InitialPos + Length(StartTag) - 1);
      InitialPos := Pos(EndTag, S);
      if InitialPos = 0 then
         result := S
      else
      begin
         result := Copy(S, 1, InitialPos - 1);
         Delete(S, 1, InitialPos + 1);
      end;
   end;
end;

//------------------------------------------------------------------------------------

function DeleteTags(var S: string): string;
var
   n, len, tag: Integer;
   c: char;
   t: String;
begin
   tag := 0;
   t := '';
   len := length(s);

   for n :=1 to len do
   begin
      c := Copy(s,n,1);

      // quitamos los tabuladores
      if c = #9 then c := ' ';

      if tag = 1 then
      begin
         if c = '>' then tag := 0;
         continue;
      end
      else
      begin
         if c = '<' then
         begin
            tag := 1;
            continue;
         end;
         t := t + c;
      end;
   end
   s := t;
   result := t;
end;

//------------------------------------------------------------------------------------

procedure AnalyzePage(Address: string);
var
   Page: TStringList;
   LineNr: Integer;
   Line,Line2: string;
   Count: Integer;
   MovieTitle, MovieAddress: string;

begin
   Count := 0;
   Page  := TStringList.Create;
   Page.Text := GetPage(Address);
     PickTreeClear;


   // Veamos si solo hay un solo resultado
   LineNr := FindLine('<b>1 resultados.</b>', Page, 0);
   if LineNr <> -1 then
   begin
      Line         := Page.GetString(LineNr + 7);
      Line2        := Line;
      MovieAddress := TextBetween(Line, '<b><a href="', '">');
      MovieTitle   := TextBetween(Line2, '.html">', '</td>');

      HTMLDecode(MovieTitle);
      DeleteTags(MovieTitle);

      if (MovieAddress <> '') AND (MovieTitle <> '') then
      begin
         MovieAddress := BaseURL1 + MovieAddress;
         PickTreeAdd(MovieTitle, MovieAddress);
         if GetOption('DontAsk') = 0 then
           if PickTreeExec(MovieAddress) then
              AnalyzeMoviePage(MovieAddress);
         if GetOption('DontAsk') = 1 then
           AnalyzeMoviePage(MovieAddress);
      end
      Page.Free;
      exit;
   end;

   // Veamos cuantos resultados se han encontrado
   LineNr := FindLine('resultados.</b></td></tr>', Page, 0);
   if LineNr <> -1 then
   begin
      Line  := Page.GetString(LineNr);
      Count := StrToInt(TextBetween(Line, '<b>', ' resultados.</b>'), 0);
   end;


   // Si no hemos encontrado ningún resultado, abandonamos
   if Count = 0 then
   begin
      ShowMessage('No se ha encontrado ningún registro');
      Page.Free;
      exit;
   end;

   LineNr := 0;

   while TRUE do
   begin

      LineNr := FindLine('<b><a href="', Page, LineNr + 1);
      if LineNr = -1 then
      begin
         LineNr := FindLine('<b>siguientes >></b>', Page,0);
         if LineNr = -1 then
            break;

         Line      := Page.GetString(LineNr);
         Address   := TextBetween(Line, '<a href="', '">');
         Page.Text := GetPage(Address);
         LineNr    := 0;
         continue;
      end;

      Line         := Page.GetString(LineNr);
      Line2        := Line;
      MovieAddress := TextBetween(Line, '<b><a href="', '">');
      MovieTitle   := TextBetween(Line2, '.html">', '</td>');

      HTMLDecode(MovieTitle);
      DeleteTags(MovieTitle);

      if (MovieAddress <> '') AND (MovieTitle <> '') then
         PickTreeAdd(MovieTitle, BaseURL1 + MovieAddress);
   end;

   if PickTreeExec(Address) then
      AnalyzeMoviePage(Address);

   Page.Free;
end;

//------------------------------------------------------------------------------------

procedure AnalyzeMoviePage(Address: string);
var
   Page: TStringList;
   LineNr: Integer;
   Line: string;
   Item: string;
   Comments: string;
   Actors: string;
   Directors: string;

begin
   Comments := '';
   Actors := '';

   // URL
   SetField(fieldURL, Address);

   Page := TStringList.Create;
   Page.Text := GetPage(Address);

   // Translated Title
   LineNr := FindLine('<div style="margin-bottom: 4; padding:1; text-align: left; border-bottom: 1px solid #990000;"><span style="color:#990000; font-size:16; font-weight: bold;">', Page, 0);
   Line := Page.GetString(LineNr);
   Item := TextBetween(Line, ' border="0"> ', '</span>');
   HTMLDecode(Item);
   SetField(fieldTranslatedTitle, Trim(Item));

   // Original Title
   LineNr := FindLine('<b>TÍTULO ORIGINAL</b>', Page, LineNr);
   if LineNr <> -1 then
   begin
      Line := Page.GetString(LineNr + 1);
      Item := TextBetween(Line, '<td ><b>', '</b></td>');
      HTMLDecode(Item);
      SetField(fieldOriginalTitle, Trim(Item));
   end;

   // Year
   LineNr := FindLine('<b>AÑO</b>', Page, LineNr);
   if LineNr <> -1 then
   begin
      Line := Page.GetString(LineNr + 3);
      Item := TextBetween(Line, '<td >', '</td>');
      HTMLDecode(Item);
      SetField(fieldYear, Trim(Item));
   end;

   // Length
   LineNr := FindLine('<b>DURACIÓN</b>', Page, LineNr);
   if LineNr <> -1 then
   begin
      Line := Page.GetString(LineNr + 3);
      Item := TextBetween(Line, '<td>', ' min.</td>');
      HTMLDecode(Item);
      SetField(fieldLength, Trim(Item));
   end;

   // Country
   LineNr := FindLine('<b>PAÍS</b>', Page, LineNr);
   if LineNr <> -1 then
   begin
      Line := Page.GetString(LineNr + 3);
      Item := TextBetween(Line, 'title="', '" border');
      HTMLDecode(Item);
      SetField(fieldCountry, Trim(Item));
   end;

   // Director
   LineNr := FindLine('<b>DIRECTOR</b>', Page, LineNr);
   if LineNr <> -1 then
   begin
      Line := Page.GetString(LineNr + 1);
      Directors := '';
      while Pos('stype=director', Line) > 0 do
      begin
         Item := TextBetween(Line, '">', '</a>');
         HTMLDecode(Item);
         if Directors = '' then
            Directors := Item
         else
            Directors := Directors + ', ' + Item;
      end;
      SetField(fieldDirector, Trim(Directors));
   end;

   // Script writer
   LineNr := FindLine('<b>GUIÓN</b>', Page, LineNr);
   if LineNr <> -1 then
   begin
      Line := Page.GetString(LineNr + 1);
      Item := TextBetween(Line, '<td >', '</td>');
      Comments := Comments + 'Guión: ' + Item + #13#10 + #13#10;
   end;

   // Composer
   LineNr := FindLine('<b>MÚSICA</b>', Page, LineNr);
   if LineNr <> -1 then
   begin
      Line := Page.GetString(LineNr + 1);
      Item := TextBetween(Line, '<td  >', '</td>');
      Comments := Comments + 'Música: ' + Item + #13#10 + #13#10;
   end;

   // Photography
   LineNr := FindLine('<b>FOTOGRAFÍA</b', Page, LineNr);
   if LineNr <> -1 then
   begin
      Line := Page.GetString(LineNr + 1);
      Item := TextBetween(Line, '<td  >', '</td>');
      Comments := Comments + 'Fotografía: ' + Item + #13#10 + #13#10;
   end;

   // Actors
   LineNr := FindLine('<b>REPARTO</b>', Page, LineNr);
   if LineNr <> -1 then
   begin
     Line := '';
     while TRUE do
     begin
        LineNR := LineNR + 1;
        Line   := Line + Page.GetString(LineNr);
        if Pos('</td>', Line) > 0 then
           break;
     end;

     Actors := TextBetween(Line, '">', '</a>') + #13#10;
     while Pos('stype=cast', Line) > 0 do
        Actors := Actors + TextBetween(Line, '"> ', '</a>') + #13#10;
     HTMLDecode(Actors);
     SetField(fieldActors, Actors);
   end;

   // Productor
   LineNr := FindLine('<b>PRODUCTORA</b>', Page, LineNr);
   if LineNr <> -1 then
   begin
      Line := Page.GetString(LineNr + 1);
      Item := TextBetween(Line, '<td  >', '</td>');
      HTMLDecode(Item);
      SetField(fieldProducer, Trim(Item));
   end;

   // Official Webpage
   LineNr := FindLine('<b>WEB OFICIAL</b>', Page, LineNr);
   if LineNr <> -1 then
   begin
      Line := Page.GetString(LineNr + 1);
      Comments := Comments + 'Web oficial: ' + TextBetween(Line, '<a href="', '" target="_blank">') + #13#10 + #13#10;
   end;

   // Awards
   LineNr := FindLine('<b>PREMIOS</b>', Page, LineNr);
   if LineNr <> -1 then
   begin
      LineNr   := LineNr + 1;
      Line     := Page.GetString(LineNr);
      Comments := Comments + 'Premios: ' + #13#10;
      while Pos('<a href="/es/awards.php', Line) > 0 do
      begin
        Item := DeleteTags(Line);
        Comments := Comments + '  - ' + Trim(Item) + #13#10;
        LineNr   := LineNr + 1;
        Line     := Page.GetString(LineNr);
      end;
      Comments := Comments + #13#10;
   end;

   // Category
   LineNr := FindLine('<b>GÉNERO</b>', Page, LineNr);
   if LineNr <> -1 then
   begin
      Line := Page.GetString(LineNr + 2);
      Item := DeleteTags(Line);
      HTMLDecode(Item);
      SetField(fieldCategory, Trim(Item));
   end;

   // Synopsis
   LineNr := FindLine('<b>SINOPSIS</b>', Page, LineNr);
   if LineNr <> -1 then
   begin
      Line := Page.GetString(LineNr + 1);
      Item := TextBetween(Line, '<td>', '</td>');
      HTMLDecode(Item);
      SetField(fieldDescription, Trim(Item));
   end;

   // Critic
   LineNr := FindLine('<b>CRÍTICAS</b>', Page, LineNr);
   if LineNr <> -1 then
   begin
      Item := Page.GetString(LineNr + 3);
      while Pos('<br>', Item) <> 0 do
         Item := StringReplace(Item, '<br>', #13#10);
      while Pos('</br>', Item) <> 0 do
         Item := StringReplace(Item, '</br>', #13#10);
      while Pos('  ', Item) <> 0 do
         Item := StringReplace(Item, '  ', ' ');
      Comments := Comments + 'Críticas: ' + #13#10 + DeleteTags(Item) + #13#10;
   end;

   // Picture
   LineNr := FindLine('http://pics.filmaffinity.com/', Page, LineNr);
   if LineNr <> -1 then
   begin
      Line := Page.GetString(LineNr);
      Item := TextBetween(Line, '<a class="lightbox" href="', '"');
      if Length(Item) = 0 then
         Item := TextBetween(Line, '<img src="', '"');
      GetPicture(Item);
   end;

   // Rating
   LineNr := FindLine('<td align="center" style="color:#990000; font-size:22px; font-weight: bold;">', Page, LineNr);
   if LineNr <> -1 then
   begin
      Line := Page.GetString(LineNr);
      Item := TextBetween(Line, '<td align="center" style="color:#990000; font-size:22px; font-weight: bold;">', '</td>');
      HTMLDecode(Item);
      SetField(fieldRating, Item);
   end;

   HTMLDecode(Comments);
   SetField(fieldComments, Comments);
end;

//------------------------------------------------------------------------------------

begin
   if (CheckVersion(3,5,0) = FALSE) then
   begin
      ShowMessage('Se requiere Ant Movie Catalog versión 3.5 o superior');
      exit;
   end;

   MovieName := GetField(fieldOriginalTitle);
   if MovieName = '' then
      MovieName := GetField(fieldTranslatedTitle);

   if GetOption('DontAsk') = 0 then
      Input('FilmAffinity', 'Pelicula:', MovieName);

   if Pos('filmaffinity.com', MovieName) > 0 then
      AnalyzeMoviePage(MovieName)
   else
      AnalyzePage(BaseURL1 +'/es/search.php?stext=' + UrlEncode(MovieName)  + '&stype=Title');
end.
m2s
Posts: 16
Joined: 2010-02-27 17:46:48

Post by m2s »

Muchas gracias por la actualización.
He encontrado un problema: Si hay varias críticas, sólo importa la primera, el resto no aparecen.
Saludos
aviloria
Posts: 24
Joined: 2006-11-08 11:52:28

Post by aviloria »

He estado probado la última versión antes de lanzarla con varias películas y creo no haber tenido ese problema...

¿Puedes darme más información? ¿En qué película(s) te ocurrió?
Gracias por informar del problema.
:wink:
m2s
Posts: 16
Joined: 2010-02-27 17:46:48

Post by m2s »

aviloria wrote:He estado probado la última versión antes de lanzarla con varias películas y creo no haber tenido ese problema...

¿Puedes darme más información? ¿En qué película(s) te ocurrió?
Gracias por informar del problema.
:wink:
Me pasa con todas las que he probado. Ahí van varios ejemplos: Invictus, El Solista, Shutter Island.
magol
Posts: 26
Joined: 2010-03-05 11:28:38

Ayuda Script FilmAffinity

Post by magol »

Hola, soy un poco novato en esto. Desde hace algún tiempo, Ant Movie 3.5.1 no captura algunos campos: descripción, título original, género...
He actualizado con este script y sigue igual, no sé si he hecho algo mal, el script está en su correspondiente carpeta, es la versión 2.48. Tampoco captura el nuevo campo "premios" que antes no estaba.
Me pueden ayudar.
Saludos y gracias.
magol
Posts: 26
Joined: 2010-03-05 11:28:38

V2.49 correcto

Post by magol »

Hola, actualizado a la última versión 2,49 y funciona correctamente.
Muchas gracias aviloria, excelente trabajo.
Saludos
Post Reply