FilmAffinity (ES): New version of the script
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:
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;
-
- Posts: 26
- Joined: 2013-04-11 07:13:02
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:
Saludos.
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
problema con busqueda
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
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
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)
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 camposantp 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)
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.
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,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.
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');
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...
Thanks!
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
Gracias
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):
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:
por esto:
Como paso la variable MovieAddress en lugar de Address, tengo que añadir código en AnalyzeMoviePage para que se pegue la URL completa:
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.
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):
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);
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
Code: Select all
// URL
MovieURL := BaseURL+Address;
SetField(fieldURL, MovieURL);
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.
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:
Por:
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
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);
Code: Select all
if ((Count = 1) and (GetOption('DontAsk') = 1)) then
AnalyzeMoviePage(BaseURL + MovieAddress)
else
begin
PickTreeExec(Address);
AnalyzeMoviePage(Address)
end
Last edited by Arturo on 2013-10-31 18:14:30, edited 1 time in total.
No consigo reproducir lo que te pasa. Si pudieras darnos algo más de información. Por ejemplo, al ejecutar el script: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
- 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.
Perfecta tu forma sencilla, Arturo. Gracias!Arturo wrote: Para corregirlo se puede hacer lo que dice asklepios (no lo he probado) o de forma un poco más sencilla:
Sustituir:Por:Code: Select all
if ((Count = 1) and (GetOption('DontAsk') = 1)) or PickTreeExec(Address) then AnalyzeMoviePage(Address);
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 ScriptCode: Select all
if ((Count = 1) and (GetOption('DontAsk') = 1)) then AnalyzeMoviePage(BaseURL + MovieAddress) else begin PickTreeExec(Address); AnalyzeMoviePage(Address) end
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.
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]
Ah, he cambiado lo siguiente en procedure AnalyzeMoviePage
para que se pueda presentar el script en el foro sin el problema del codigo estrella (★)
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, '*');