FilmAffinity (ES): New version of the script

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.
Arturo
Posts: 52
Joined: 2013-04-11 16:28:52

Post by Arturo »

Correcto jacqlittle. Buen trabajo
Arturo
Posts: 52
Joined: 2013-04-11 16:28:52

Post by Arturo »

Sobre lo que dice Keruh si he comprobado que a veces no salen los actores. Comprobadlo con la película Santa Sangre.

Para solucionarlo de momento sin borrar nada por si acaso, propongo modificar el apartado //Actors de la siguiente forma:

Code: Select all

// Actors
   LineNr := FindLine('<dt>Reparto</dt>', Page, LineNr);
   if LineNr <> -1 then
   begin
      Line := Page.GetString(LineNr + 1);
      if Length(TextBetween(Line, '<dd>', '</dd>')) = 0 then
         Item := DeleteTags(Line)
      else Item := DeleteTags(TextBetween(Line, '<dd>', '</dd>'));
      if GetOption('ActorsInALine') = 0 then Item := StringReplace(Item, ', ', #13#10);
      SetField(fieldActors, Item);
   end;
jacqlittle
Posts: 26
Joined: 2013-04-11 07:13:02

Post by jacqlittle »

Pues tienes razón, tengo 400 y pico películas en la base de datos y hasta la fecha con ninguna había tenido problemas, pero efectivamente con la película que dices no importa los actores bien.

He probado los cambios que comentas y funciona perfectamente.

Pego el código a continuación, pero ojo que ocurre como con la versión anterior, que aquí en el foro no se visualiza bien la dichosa estrellita '★', así que pongo también un link de descarga en MEGA para evitar problemas.

Si antp da el Vº Bº que lo suba al servidor para que los que quieran con el script [ UPDATE SCRIPTS ] lo puedan actualizar:

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, juliojs, Albher, Arturo, jacqlittle
Title=FilmAffinity (ES)
Description=Movie importation script for FilmAffinity Spain
Site=http://www.filmaffinity.com
Language=ES
Version=2.68
Requires=3.5.0
Comments=Updated to 2013/08/08 version of the web-page. Corrected import of Actors.
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
RequiresMovies=1

[Options]
DontAsk=0|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
ActorsInALine=0|0|1=Actores separados por comas|0=Actores en lineas independientes

[Parameters]

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

program FilmAffinity;
const
   BaseURL = '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(S: string; StartTag: string; EndTag: string): string;
var
   ini, fin: Integer;
begin
   Result := '';
   ini := Pos(StartTag, S);
   if ini <> 0 then
   begin
      ini := ini + Length(StartTag);
      fin := Pos(EndTag, S);
      if (fin <> 0) and (fin > ini) then
      begin
         Result := Copy(S, ini, fin - ini);
      end;
   end;
end;

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

function DeleteTags(S: string): string;
var
   n, len, tag: Integer;
   c, p: char;
begin
   HTMLDecode(S);
   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;

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

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

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

   // Get how much search results have been found
   LineNr := FindLine('</strong> resultados.</div>', Page, 0);
   if LineNr <> -1 then
   begin
      Line  := Page.GetString(LineNr);
      Count := StrToInt(TextBetween(Line, '<div style="text-align:right;"><strong>', '</strong> resultados.</div>'), 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   := DeleteTags(TextBetween(Line, '.html">', '<img src="'));

         if (Length(MovieAddress) <> 0) and (Length(MovieTitle) <> 0) then
            PickTreeAdd(MovieTitle, BaseURL + MovieAddress);
      end;

      if ((Count = 1) and (GetOption('DontAsk') = 1)) or PickTreeExec(Address) then
         AnalyzeMoviePage(Address);
   end;
   Page.Free;
end;

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

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

begin
   Comments := '';

   // URL
   SetField(fieldURL, Address);

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

   // Translated Title
   LineNr := FindLine('<h1 id="main-title">', Page, 0);
   Line := Page.GetString(LineNr);
   Item := DeleteTags(TextBetween(Line, '<h1 id="main-title">', '</h1>'));
   SetField(fieldTranslatedTitle, Item);

   // 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="', '" title="');
      if Length(Item) = 0 then
         Item := TextBetween(Line, '" src="', '"></a>');
      GetPicture(Item);
   end;

   // Rating
   LineNr := FindLine('<div id="movie-rat-avg" itemprop="ratingValue">', Page, LineNr);
   if LineNr <> -1 then
   begin
      Line := Page.GetString(LineNr + 1);
      Item := DeleteTags(Line);
      SetField(fieldRating, StringReplace(Item, ',', '.'));
   end;

   // Original Title
   LineNr := FindLine('<dt>Título original</dt>', Page, LineNr);
   if LineNr <> -1 then
   begin
      Line := Page.GetString(LineNr + 1);
      Item := DeleteTags(TextBetween(Line, '<dd>', '</dd>'));
      SetField(fieldOriginalTitle, Item);
   end;

   // Year
   LineNr := FindLine('<dt>Año</dt>', Page, LineNr);
   if LineNr <> -1 then
   begin
      Line := Page.GetString(LineNr + 1);
      Item := DeleteTags(TextBetween(Line, '<dd>', '</dd>'));
      SetField(fieldYear, Item);
   end;

   // Length
   LineNr := FindLine('<dt>Duración</dt>', Page, LineNr);
   if LineNr <> -1 then
   begin
      Line := Page.GetString(LineNr + 1);
      Item := DeleteTags(TextBetween(Line, '<dd>', 'min.</dd>'));
      SetField(fieldLength, Item);
   end;

   // Country
   LineNr := FindLine('<dt>País</dt>', Page, LineNr);
   if LineNr <> -1 then
   begin
      Line := Page.GetString(LineNr + 1);
      Item := DeleteTags(TextBetween(Line, 'title="', '" border'));
      SetField(fieldCountry, Item);
   end;
 
   // Director
   LineNr := FindLine('<dt>Director</dt>', Page, LineNr);
   if LineNr <> -1 then
   begin
      Line := Page.GetString(LineNr + 1);
      Item := DeleteTags(TextBetween(Line, '<dd>', '</dd>'));
      SetField(fieldDirector, Item);
   end;

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

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

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

   // Actors
   LineNr := FindLine('<dt>Reparto</dt>', Page, LineNr);
   if LineNr <> -1 then
   begin
      Line := Page.GetString(LineNr + 1);
      if Length(TextBetween(Line, '<dd>', '</dd>')) = 0 then
         Item := DeleteTags(Line)
      else Item := DeleteTags(TextBetween(Line, '<dd>', '</dd>'));
      if GetOption('ActorsInALine') = 0 then Item := StringReplace(Item, ', ', #13#10);
      SetField(fieldActors, Item);
   end;

   // Productor
   LineNr := FindLine('<dt>Productora</dt>', Page, LineNr);
   if LineNr <> -1 then
   begin
      Line := Page.GetString(LineNr + 1);
      Item := DeleteTags(TextBetween(Line, '<dd>', '</dd>'));
      SetField(fieldProducer, Item);
   end;

   // Category
   LineNr := FindLine('<dt>Género</dt>', Page, LineNr);
   if LineNr <> -1 then
   begin
      Line := Page.GetString(LineNr + 2);
      Item := DeleteTags(Line);
      Item := StringReplace(Item, ' | ', ', ');
      Item := StringReplace(Item, '. ', ', ');
      SetField(fieldCategory, Item);
   end;

   // Official Webpage
   LineNr := FindLine('<dt>Web Oficial</dt>', Page, LineNr);
   if LineNr <> -1 then
   begin
      Line := Page.GetString(LineNr + 1);
      Item := DeleteTags(TextBetween(Line, ' href="', '">'));
      Comments := Comments + 'Web oficial: ' + Item + #13#10 + #13#10;
   end;

   // Synopsis
   LineNr := FindLine('<dt>Sinopsis</dt>', Page, LineNr);
   if LineNr <> -1 then
   begin
      Line := Page.GetString(LineNr + 1);
      Item := DeleteTags(Line);
      SetField(fieldDescription, Item);
   end;

   // Awards
   LineNr := FindLine('<dt>Premios</dt>', Page, LineNr);
   if LineNr <> -1 then
   begin
      LineNr   := LineNr + 1;
      Line     := Page.GetString(LineNr);
      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);
            if (Length(Item) <> 0) then
            begin
               Comments := Comments + '  - ' + Item + #13#10;
            end;
         end;
         LineNr := LineNr + 1;
         Line   := Page.GetString(LineNr);
      end;
      Comments := Comments + #13#10;
   end;

   // Critic
   LineNr := FindLine('<dt>Críticas</dt>', Page, LineNr);
   if LineNr <> -1 then
   begin
      Comments := Comments + 'Críticas: ' + #13#10 + #13#10;
      LineNr := FindLine('<div class="pro-review">', Page, LineNr + 1);
      while LineNr <> -1 do
      begin
         LineNr := LineNr + 1;
         Line := Page.GetString(LineNr);
         LineInc := 2;
         if Pos ('<a title="Leer crítica completa" href=', Line) <> 0 then
         begin
            LineNr := LineNr + 1;
            Line := Page.GetString(LineNr);
            LineInc := 3;
         end;
         Line:= StringReplace(Line, '★', '*');
         Item := DeleteTags(Line);
         if (Length(Item) <> 0) then
         begin
            Comments := Comments + Item + #13#10;
            LineNr := LineNr + LineInc;
            Line := Page.GetString(LineNr);
            Item := DeleteTags(Line);
            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);
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 Length(MovieName) = 0 then
      MovieName := GetField(fieldTranslatedTitle);

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

   if Pos('filmaffinity.com', MovieName) > 0 then
      AnalyzeMoviePage(MovieName)
   else
      AnalyzePage(BaseURL +'/es/search.php?stext=' + UrlEncode(MovieName) + '&stype=Title');
end. 

Code: Select all

https://mega.co.nz/#!MldHzQaD!T6ZQ_lGrBaRAw8RvFuFBiS-_LyA861zPGpwHjT5KePI
Saludos.
antp
Site Admin
Posts: 9629
Joined: 2002-05-30 10:13:07
Location: Brussels
Contact:

Post by antp »

Thanks, it is now on the server ;)
johndick
Posts: 8
Joined: 2009-04-29 18:36:47

problema con busqueda

Post by johndick »

tengo un pequeño prblema con un listado de peliculas.

me gustaria o mejor dicho DEBO hacer la busqueda mediante el titulo traducido y no desde el titulo original, me gustaria saber si alguien me puede ayudar a modificar el script o me indique donde esta el apartado de la busqueda? muchas gracias de antemano
antp
Site Admin
Posts: 9629
Joined: 2002-05-30 10:13:07
Location: Brussels
Contact:

Post by antp »

Check at the bottom of the script, there are lines containing
GetField(fieldOriginalTitle)
and
GetField(fieldTranslatedTitle)
that's where the program gets the original title and translated title (if the original one is empty)
You can swap the names "fieldOriginalTitle" and "fieldTranslatedTitle" (but not the whole lines)
johndick
Posts: 8
Joined: 2009-04-29 18:36:47

Post by johndick »

antp wrote:Check at the bottom of the script, there are lines containing
GetField(fieldOriginalTitle)
and
GetField(fieldTranslatedTitle)
that's where the program gets the original title and translated title (if the original one is empty)
You can swap the names "fieldOriginalTitle" and "fieldTranslatedTitle" (but not the whole lines)
MUCHAS GRACIAS AMIGO funciono correctamente remplazand los campos
konvulso
Posts: 1
Joined: 2013-09-30 22:33:23

Post by konvulso »

Muy buenas.

Tengo hace tiempo un problema con el script, y no encuentro forma de solucionarlo.

En algunos casos pierde los decimales de la puntuación de la peli. Otras, la cambia a un valor incorrecto (grava un 6.5 en lugar del 6.6 publicado en la web, probado con "1984", por ejemplo).

He probado a poner un punto de interrupción en la seccion correspondiente del código para examinar la variable "Item", y, en tiempo de ejecución-depuración el valor es correcto. Luego lo muestra y lo almacena mal.

Alguien me podría dar alguna pista?

Gracias de antemano y un saludo a todo el mundo.
juliojs
Posts: 10
Joined: 2013-04-25 19:08:37

Post by juliojs »

konvulso wrote:Muy buenas.

Tengo hace tiempo un problema con el script, y no encuentro forma de solucionarlo.

En algunos casos pierde los decimales de la puntuación de la peli. Otras, la cambia a un valor incorrecto (grava un 6.5 en lugar del 6.6 publicado en la web, probado con "1984", por ejemplo).

He probado a poner un punto de interrupción en la seccion correspondiente del código para examinar la variable "Item", y, en tiempo de ejecución-depuración el valor es correcto. Luego lo muestra y lo almacena mal.

Alguien me podría dar alguna pista?

Gracias de antemano y un saludo a todo el mundo.
Hola,

Te confirmo que yo también he podido reproducir el problema, pero desde mi punto de vista se trata más de un problema interno de la aplicación que de un problema del script, ya que ésto pasa con varios de los scripts.

He probado cambiando el valor manualmente (CINEOL, FILMAFFYNINTY, IMDB) con:

Code: Select all

SetField(fieldRating, '6.6');
y en todos los casos devuelve el valor 6,5.

He estado echando un ojo al source de la aplicación pero me pierdo bastante... XD
Haciendo una búsqueda, lo más relevante que he encontrado ha sido las referencias a "fieldRating" e "iRanting" en la clase "movieclass.pas", que se encargan de convertir el valor de ese campo, quizás pueda ser ese el problema, seguro que antp nos puede aclarar algo más aquí.


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

To antp:
It seems to be an application bug.
After setting the value manually on edit mode, the applicaction always changes it on any script. I just found some references to "fieldRating" and "iRating" on "movieclass.pas" that may cause this problems, but this is only a guess... XD
Maybe you can help us on this... :D

Thanks!
soulsnake
Posts: 756
Joined: 2011-03-14 15:42:20
Location: France

Post by soulsnake »

Hi,

Sorry for this bug.
It has already been fixed in AMC 4.2 beta.

Soulsnake.
Last edited by soulsnake on 2013-10-02 19:42:19, edited 1 time in total.
juliojs
Posts: 10
Joined: 2013-04-25 19:08:37

Post by juliojs »

soulsnake wrote:Hi,

Sorry for this bug.
It has already been fixed in AMC 4.2 beta.

Soulsnake.
Ahhh ok!

Thank you!!
lik
Posts: 6
Joined: 2013-10-16 19:26:39

Post by lik »

hola, cambiando el script de filmaffinity por este nuevo me busca perfectamente, pero me ocurre un problema. Cuando le das a f6, sale la lista de script, si pulso en cualquiera me deja introducir el texto a buscar, pero en este en concreto, el de filmaffinity, no me deja buscar, y automáticamente me saca una búsqueda anterior que hice de "EL legado de Bourne". Da igual que cancele, que acepte, que guarde los datos, he probado a cambiar todo tipo de opciones, pero siempre me busca solo esa película y no me deja buscar otra. A ver si alguien me puede echar una mano.

Gracias
Arturo
Posts: 52
Joined: 2013-04-11 16:28:52

Post by Arturo »

Seguramente tienes la opción DontAsk (en Opciones de Script, a la derecha de la lista de scripts) con valor 1.
Debes ponerla en valor = 0 para que te pregunte.
lik
Posts: 6
Joined: 2013-10-16 19:26:39

Post by lik »

Pues no, lo tengo en 0 ese valor. Pero es curioso que solo me pase con filmaffinity. si abro cualquier otro si que me aparece el dialogo para poder introducir el nombre a buscar en la peli. He desinstalado y borrado todo y vuelto a poner y no se arregla. es muy raro pero no se que pueda ser
asklepios
Posts: 2
Joined: 2013-10-28 09:00:16

Post by asklepios »

Hola:

Vengo usando este script desde hace bastante tiempo (actualmente, v.2.68), así que aprovecho para daros las GRACIAS por su creación y desarrollo.

Hay una cosa que no logro entender, y es que si la opción "Don't Ask" es "1", ¿por qué sale un listado cuando sólo hay una opción posible? Por ejemplo, al buscar "Código del hampa" (sin añadir el título original):

Image


Si tengo muchas películas que actualizar, el proceso se hace bastante lento al tener que estar pendiente de TODAS ellas.

Me he permitido modificar el script para que, al menos en los resultados únicos, no sea necesario "seleccionar" el título, sino que toda la información de la película se descargue automáticamente. No obstante, no estoy completamente seguro de si esta modificación afectará a otras partes del código...

En procedure AnalyzePage(Address: string):
He cambiado esto:

Code: Select all

if ((Count = 1) and (GetOption('DontAsk') = 1)) or PickTreeExec(Address) then
AnalyzeMoviePage(Address);
por esto:

Code: Select all

      if (Count > 1) then
        begin
        PickTreeExec(Address);
        AnalyzeMoviePage(MovieAddress);
        end
      if ((Count = 1) and (GetOption('DontAsk') = 1)) then
        begin
        AnalyzeMoviePage(MovieAddress);
        end
Como paso la variable MovieAddress en lugar de Address, tengo que añadir código en AnalyzeMoviePage para que se pegue la URL completa:

Code: Select all

   // URL
   MovieURL := BaseURL+Address;
   SetField(fieldURL, MovieURL);
De hecho, la variable MovieURL ya estaba declarada, aunque no sé qué uso tenía...

En fin, de esta forma no necesito confirmar las películas cuyo resultado es único. Si veis que, con esta modificación, hay algún inconveniente en la ejecución del código, en general o en alguna parte, agradecería que lo comunicaseis.

Un saludo.
Asklepios.
Arturo
Posts: 52
Joined: 2013-04-11 16:28:52

Post by Arturo »

Personalmente tengo siempre la opción DontAsk en 0, creo que para mi tiene alguna ventaja: Por ejemplo si tienes un registro en blanco (sin Titulo Original ni Titulo traducido) y tienes DontAsk = 1, el Script se ejecuta sin encontrar nada.
Pero es cierto que con el codigo actual no se cumple lo que dice en [Options] de la cabecera del script en cuanto a la opción DontAsk.
Para corregirlo se puede hacer lo que dice asklepios (no lo he probado) o de forma un poco más sencilla:
Sustituir:

Code: Select all

if ((Count = 1) and (GetOption('DontAsk') = 1)) or PickTreeExec(Address) then
         AnalyzeMoviePage(Address);
Por:

Code: Select all

if ((Count = 1) and (GetOption('DontAsk') = 1)) then
    AnalyzeMoviePage(BaseURL + MovieAddress)
else
begin
    PickTreeExec(Address);
    AnalyzeMoviePage(Address)
end
Recordando que poniendo DontAsk = 1 Siempre tiene que estár el nombre de la película en Titulo Original o Titulo traducido antes de ejecutar el Script
Last edited by Arturo on 2013-10-31 18:14:30, edited 1 time in total.
Arturo
Posts: 52
Joined: 2013-04-11 16:28:52

Post by Arturo »

lik wrote:Pues no, lo tengo en 0 ese valor. Pero es curioso que solo me pase con filmaffinity. si abro cualquier otro si que me aparece el dialogo para poder introducir el nombre a buscar en la peli. He desinstalado y borrado todo y vuelto a poner y no se arregla. es muy raro pero no se que pueda ser
No consigo reproducir lo que te pasa. Si pudieras darnos algo más de información. Por ejemplo, al ejecutar el script:
- Te sale la ventana del arbol (la que muestra asklepios en esta página)
- Te sale la ventana de resultados (Results para script)
- ¿Que tienes en los campos Título original y Título traducido antes de pulsar F6?

Un saludo.
asklepios
Posts: 2
Joined: 2013-10-28 09:00:16

Post by asklepios »

Arturo wrote: Para corregirlo se puede hacer lo que dice asklepios (no lo he probado) o de forma un poco más sencilla:
Sustituir:

Code: Select all

if ((Count = 1) and (GetOption('DontAsk') = 1)) or PickTreeExec(Address) then
         AnalyzeMoviePage(Address);
Por:

Code: Select all

if ((Count = 1) and (GetOption('DontAsk') = 1)) then
    AnalyzeMoviePage(BaseURL + MovieAddress)
else
begin
    PickTreeExec(Address);
    AnalyzeMoviePage(Address)
end
Recordando que poniendo DontAsk = 1 Siempre tiene que estar el nombre de la película en Titulo Original o Titulo traducido antes de ejecutar el Script
Perfecta tu forma sencilla, Arturo. Gracias!

Si tienes un buen número de películas por actualizar, lo mejor es el DontAsk=1 (escribiendo, pegando o importando de una lista los títulos previamente, claro). Yo siempre compruebo, cuando termina la ejecución, que no se queden películas en blanco, suele pasar cuando el título contiene una errata...

Un saludo.
Arturo
Posts: 52
Joined: 2013-04-11 16:28:52

Post by Arturo »

Nueva versión 2.69 añadiendo la correccion de lo detectado por asklepios, en cuanto al procesamiento con la opción DontAsk = 1:

Probadlo y si no encontrais errores que antp lo suba al [UPDATE]

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, juliojs, Albher, Arturo, jacqlittle
Title=FilmAffinity (ES)
Description=Movie importation script for FilmAffinity Spain
Site=http://www.filmaffinity.com
Language=ES
Version=2.69
Requires=3.5.0
Comments=Updated to 2013/11/06 version of the web-page. Corrected Process DontAsk=1
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
RequiresMovies=1

[Options]
DontAsk=0|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
ActorsInALine=0|0|1=Actores separados por comas|0=Actores en lineas independientes

[Parameters]

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

program FilmAffinity;
const
   BaseURL = '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(S: string; StartTag: string; EndTag: string): string;
var
   ini, fin: Integer;
begin
   Result := '';
   ini := Pos(StartTag, S);
   if ini <> 0 then
   begin
      ini := ini + Length(StartTag);
      fin := Pos(EndTag, S);
      if (fin <> 0) and (fin > ini) then
      begin
         Result := Copy(S, ini, fin - ini);
      end;
   end;
end;

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

function DeleteTags(S: string): string;
var
   n, len, tag: Integer;
   c, p: char;
begin
   HTMLDecode(S);
   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;

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

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

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

   // Get how much search results have been found
   LineNr := FindLine('</strong> resultados.</div>', Page, 0);
   if LineNr <> -1 then
   begin
      Line  := Page.GetString(LineNr);
      Count := StrToInt(TextBetween(Line, '<div style="text-align:right;"><strong>', '</strong> resultados.</div>'), 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   := DeleteTags(TextBetween(Line, '.html">', '<img src="'));

         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
         PickTreeExec(Address);
         AnalyzeMoviePage(Address)
      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 := '';

   // URL
   SetField(fieldURL, Address);

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

   // Translated Title
   LineNr := FindLine('<h1 id="main-title">', Page, 0);
   Line := Page.GetString(LineNr);
   Item := DeleteTags(TextBetween(Line, '<h1 id="main-title">', '</h1>'));
   SetField(fieldTranslatedTitle, Item);

   // 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="', '" title="');
      if Length(Item) = 0 then
         Item := TextBetween(Line, '" src="', '"></a>');
      GetPicture(Item);
   end;

   // Rating
   LineNr := FindLine('<div id="movie-rat-avg" itemprop="ratingValue">', Page, LineNr);
   if LineNr <> -1 then
   begin
      Line := Page.GetString(LineNr + 1);
      Item := DeleteTags(Line);
      SetField(fieldRating, StringReplace(Item, ',', '.'));
   end;

   // Original Title
   LineNr := FindLine('<dt>Título original</dt>', Page, LineNr);
   if LineNr <> -1 then
   begin
      Line := Page.GetString(LineNr + 1);
      Item := DeleteTags(TextBetween(Line, '<dd>', '</dd>'));
      SetField(fieldOriginalTitle, Item);
   end;

   // Year
   LineNr := FindLine('<dt>Año</dt>', Page, LineNr);
   if LineNr <> -1 then
   begin
      Line := Page.GetString(LineNr + 1);
      Item := DeleteTags(TextBetween(Line, '<dd>', '</dd>'));
      SetField(fieldYear, Item);
   end;

   // Length
   LineNr := FindLine('<dt>Duración</dt>', Page, LineNr);
   if LineNr <> -1 then
   begin
      Line := Page.GetString(LineNr + 1);
      Item := DeleteTags(TextBetween(Line, '<dd>', 'min.</dd>'));
      SetField(fieldLength, Item);
   end;

   // Country
   LineNr := FindLine('<dt>País</dt>', Page, LineNr);
   if LineNr <> -1 then
   begin
      Line := Page.GetString(LineNr + 1);
      Item := DeleteTags(TextBetween(Line, 'title="', '" border'));
      SetField(fieldCountry, Item);
   end;
 
   // Director
   LineNr := FindLine('<dt>Director</dt>', Page, LineNr);
   if LineNr <> -1 then
   begin
      Line := Page.GetString(LineNr + 1);
      Item := DeleteTags(TextBetween(Line, '<dd>', '</dd>'));
      SetField(fieldDirector, Item);
   end;

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

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

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

   // Actors
   LineNr := FindLine('<dt>Reparto</dt>', Page, LineNr);
   if LineNr <> -1 then
   begin
      Line := Page.GetString(LineNr + 1);
      if Length(TextBetween(Line, '<dd>', '</dd>')) = 0 then
         Item := DeleteTags(Line)
      else Item := DeleteTags(TextBetween(Line, '<dd>', '</dd>'));
      if GetOption('ActorsInALine') = 0 then Item := StringReplace(Item, ', ', #13#10);
      SetField(fieldActors, Item);
   end;

   // Productor
   LineNr := FindLine('<dt>Productora</dt>', Page, LineNr);
   if LineNr <> -1 then
   begin
      Line := Page.GetString(LineNr + 1);
      Item := DeleteTags(TextBetween(Line, '<dd>', '</dd>'));
      SetField(fieldProducer, Item);
   end;

   // Category
   LineNr := FindLine('<dt>Género</dt>', Page, LineNr);
   if LineNr <> -1 then
   begin
      Line := Page.GetString(LineNr + 2);
      Item := DeleteTags(Line);
      Item := StringReplace(Item, ' | ', ', ');
      Item := StringReplace(Item, '. ', ', ');
      SetField(fieldCategory, Item);
   end;

   // Official Webpage
   LineNr := FindLine('<dt>Web Oficial</dt>', Page, LineNr);
   if LineNr <> -1 then
   begin
      Line := Page.GetString(LineNr + 1);
      Item := DeleteTags(TextBetween(Line, ' href="', '">'));
      Comments := Comments + 'Web oficial: ' + Item + #13#10 + #13#10;
   end;

   // Synopsis
   LineNr := FindLine('<dt>Sinopsis</dt>', Page, LineNr);
   if LineNr <> -1 then
   begin
      Line := Page.GetString(LineNr + 1);
      Item := DeleteTags(Line);
      SetField(fieldDescription, Item);
   end;

   // Awards
   LineNr := FindLine('<dt>Premios</dt>', Page, LineNr);
   if LineNr <> -1 then
   begin
      LineNr   := LineNr + 1;
      Line     := Page.GetString(LineNr);
      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);
            if (Length(Item) <> 0) then
            begin
               Comments := Comments + '  - ' + Item + #13#10;
            end;
         end;
         LineNr := LineNr + 1;
         Line   := Page.GetString(LineNr);
      end;
      Comments := Comments + #13#10;
   end;

   // Critic
   LineNr := FindLine('<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 := FindLine('<div class="pro-review">', Page, LineNr + 1);
      while LineNr <> -1 do
      begin
         LineNr := LineNr + 1;
         Line := Page.GetString(LineNr);
         LineInc := 2;
         if Pos ('<a title="Leer crítica completa" href=', Line) <> 0 then
         begin
            LineNr := LineNr + 1;
            Line := Page.GetString(LineNr);
            LineInc := 3;
         end;
         Line:= StringReplace(Line, CharStar, '*');
         Item := DeleteTags(Line);
         if (Length(Item) <> 0) then
         begin
            Comments := Comments + Item + #13#10;
            LineNr := LineNr + LineInc;
            Line := Page.GetString(LineNr);
            Item := DeleteTags(Line);
            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);
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 Length(MovieName) = 0 then
      MovieName := GetField(fieldTranslatedTitle);

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

   if Pos('filmaffinity.com', MovieName) > 0 then
      AnalyzeMoviePage(MovieName)
   else
      AnalyzePage(BaseURL +'/es/search.php?stext=' + UrlEncode(MovieName) + '&stype=Title');
end. 


Ah, he cambiado lo siguiente en procedure AnalyzeMoviePage

Code: Select all

      // 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;' ;
  
     ...........

     Line:= StringReplace(Line, CharStar, '*');

para que se pueda presentar el script en el foro sin el problema del codigo estrella (★)
antp
Site Admin
Posts: 9629
Joined: 2002-05-30 10:13:07
Location: Brussels
Contact:

Post by antp »

Thanks, I updated it on the server.
Good idea to split the code of the star to get around the problem of the forum replacing it ;)
Post Reply