Hola. Se añaden opciones nuevas y corrigen varios errores.
Code: Select all
(***************************************************
Ant Movie Catalog importation script
www.antp.be/software/moviecatalog/
[Infos]
Authors=mOrfiUs (morfius@hotmail.es)
Title=FilmAffinity (+carátula DVD) (ES)
Description=FilmAffinity con opción de carátula DVD
Site=http://www.filmaffinity.com
Language=ES
Version=1.00
Requires=3.5.0
Comments=Basado en todos los Scripts anteriores. Mas información en el Script
License=GPL
GetInfo=1
[Options]
AutoSelect=1|1|0=Confirmación de los títulos|1=Desatendido si sólo encuentra un resultado
Cover=1|1|0=Obtiene la carátula de Cine de Filmaffinity|1=Obtiene la carátula de DVD de Carátula Info
***************************************************)
program FilmAffinity;
const
BaseURL1 = 'http://www.filmaffinity.com';
CoverURL = 'http://www.caratulas.info/';
CoverURL1 = 'www.caratulas.info';
var
MovieName: string;
MovieURL: string;
//AutoSelect=1|1|0=Always show movie selection dialog|1=Auto-select movie if there is only one|2=Auto-select first movie|3=Fully unattended
//------------------------------------------------------------------------------------
// 15/11/2011 corregido género (ahora entre comas sin espacios)
// 15/11/2011 añadido selección (se muestra un arbol en cuya raíz está la(s) palabrba(s) en mayúsculas)
// 15/11/2011 corregido director (ahora entre comas sin espacios, Creator, ...)
// 15/11/2011 corregido director (ahora entre comas sin espacios, Creator, ...)
// 15/11/2011 corregido Título Original y Traducido (ahora sin (Serie de TV) (TV Series))
//
//------------------------------------------------------------------------------------
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 AnalyzeCoversPage(Address: string; var CoverAdress: string);
var
strPage, MovieAddr, MovieTitle, MovieID: string;
BeginPos, EndPos, ContadorPrimeras: Integer;
Page: TStringList;
begin
strPage := GetPage(Address);
BeginPos := Pos('en el dominio <b>' + CoverURL1, strPage);
if BeginPos < 1 then
begin
if GetOption('AutoSelect') = 0 then ShowError('No se han encontrado resultados.');
exit
end
else
PickTreeClear;
PickTreeAdd('Carátulas de DVD para ' + UpperCase(MovieName), '');
Delete(strPage, 1, BeginPos);
BeginPos := Pos('href="' + CoverURL, strPage);
EndPos := 1;
while ((BeginPos > 0) and (EndPos > 0)) do
begin
Delete(strPage, 1, BeginPos);
EndPos := Pos('" onmousedown', strPage);
MovieId := Copy(strPage, + 32, EndPos - 32);
MovieAddr := CoverURL + MovieId;
BeginPos := Pos('.info/',strPage);
EndPos := Pos('.htm"', strPage);
MovieTitle := Copy(strPage, BeginPos, EndPos);
MovieTitle := TextBetween (MovieTitle , '.info/', 'jpg');
//FBrowser := TBrowser(RCaseOf(RequestHeader['HTTP_USER_AGENT'], ['MSIE', 'Firefox', 'Chrome', 'Safari', 'Opera', 'Konqueror'])+1);
MovieTitle := StringReplace(MovieTitle , 'musica/', '(MUSICA) ');
MovieTitle := StringReplace(MovieTitle , 'juegos/', '(JUEGOS) ');
MovieTitle := StringReplace(MovieTitle , '-', ' ' );
MovieTitle := StringReplace(MovieTitle , 'DVD', '(DVD)' );
MovieTitle := StringReplace(MovieTitle , 'Pc', '(PC)' );
MovieTitle := StringReplace(MovieTitle , 'Vcd', '(VCD)' );
MovieTitle := StringReplace(MovieTitle , 'Trasera', '(Trasera)' );
MovieTitle := StringReplace(MovieTitle , 'cd ', '(CD)' );
MovieTitle := StringReplace(MovieTitle , '/', '' );
MovieTitle := StringReplace(MovieTitle , 'Delantera', '(Delantera)' );
MovieTitle := StringReplace(MovieTitle , 'peliculas', '' );
MovieTitle := StringReplace(MovieTitle , 'Frontal', '(Frontal)' );
MovieTitle := StringReplace(MovieTitle , 'PS2', '(PS2)' );
MovieTitle := StringReplace(MovieTitle , 'Bso', '' );
MovieTitle := StringReplace(MovieTitle , 'The Album Del', '' );
MovieTitle := StringReplace(MovieTitle , 'Divx', '(DIVX)' );
MovieTitle := StringReplace(MovieTitle , 'BSO', '' );
MovieTitle := StringReplace(MovieTitle , 'B S O', '' );
MovieTitle := StringReplace(MovieTitle , 'Inlay', '(Interior)' );
MovieTitle := StringReplace(MovieTitle , 'Slim', '(Slim)' );
ContadorPrimeras:= ContadorPrimeras + 1;
if (Pos('(DVD)', MovieTitle) > 0) And (Pos('(Frontal)', MovieTitle) > 0) And (GetOption('AutoSelect') = 1) And (ContadorPrimeras < 8) then
begin
AnalyzeCoverPage(MovieAddr, CoverAdress);
exit;
end
else
begin
PickTreeAdd(MovieTitle, MovieAddr);
BeginPos := Pos('href="' + CoverURL, strPage);
if(Pos('</body>', strPage) < BeginPos) then
BeginPos := -1;
end;
end;
if PickTreeExec(Address) then
AnalyzeCoverPage(Address, CoverAdress);
end;
//------------------------------------------------------------------------------------
procedure AnalyzeCoverPage(Address: string; var CoverAdress: string);
var
Page: TStringList;
LineNr: Integer;
Item: string;
begin
CoverAdress:= Address + #13#10;
// SetField(fieldURL, Address);
Page := TStringList.Create;
Page.Text := GetPage(Address);
// Picture
LineNr := FindLine('<p><img src="/', Page, 0);
if LineNr <> -1 then
begin
Item := copy(Page.Text, pos('<p><img src="/',Page.Text), length(Page.Text));
Item := TextBetween (Item, 'src="/', '"');
Item := Trim(Item );
GetPicture (CoverURL + Item);
end;
end;
procedure AnalyzePage(Address: string);
var
Page: TStringList;
LineNr: Integer;
Line,Line2: string;
MovieTitle, MovieAddress: string;
begin
Page := TStringList.Create;
Page.Text := GetPage(Address);
PickTreeClear;
PickTreeAdd('Resultados en Filmaffinity para ' + UpperCase(MovieName), '');
// un solo resultado
LineNr := FindLine('<strong>1</strong> resultados.</div>', 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('AutoSelect') = 0 then
if PickTreeExec(MovieAddress) then
AnalyzeMoviePage(MovieAddress);
if GetOption('AutoSelect') = 1 then
AnalyzeMoviePage(MovieAddress);
end
Page.Free;
exit;
end;
// sin resultado
LineNr := FindLine('No hay resultados exactos', Page, 0);
if LineNr <> -1 then
begin
ShowError('No se ha encontrado resultados');
Page.Free;
exit;
end;
//varios resultados
LineNr := FindLine('</strong> resultados.</div>', Page, 0);
if LineNr <> -1 then
begin
Line := Page.GetString(LineNr);
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;
CoverAdress: string;
begin
Comments := '';
Actors := '';
// URL
SetField(fieldURL, Address);
Page := TStringList.Create;
Page.Text := GetPage(Address);
// Título traducido
LineNr := FindLine('<div style="margin-bottom: 4px; padding:1px; text-align: left; border-bottom: 1px solid #990000;"><span style="color:#990000; font-size:16px; font-weight: bold;">', Page, 0);
Line := Page.GetString(LineNr);
Item := TextBetween(Line, ' border="0"> ', '</span>');
HTMLDecode(Item);
Item := StringReplace(Item, ' (Serie de TV)', '');
SetField(fieldTranslatedTitle, Trim(Item));
// Título original
LineNr := FindLine('<th>TÍTULO ORIGINAL</th>', Page, LineNr);
if LineNr <> -1 then
begin
Line := Page.GetString(LineNr + 1);
Item := TextBetween(Line, '<td><strong>', '</strong></td>');
HTMLDecode(Item);
Item := StringReplace(Item, ' (TV Series)', '');
SetField(fieldOriginalTitle, Trim(Item));
end;
// Año
LineNr := FindLine('<th>AÑO</th>', Page, LineNr);
if LineNr <> -1 then
begin
Line := Page.GetString(LineNr + 2);
if Pos('Ver trailer', Line) > 0 then
Item := TextBetween(Line, '</div> ', '</td>')
else
begin
Item := TextBetween(Line, ' ', '</td>')
end;
HTMLDecode(Item);
SetField(fieldYear, Trim(Item));
end;
// Duración
LineNr := FindLine('<th>DURACIÓN</th>', Page, LineNr);
if LineNr <> -1 then
begin
Line := Page.GetString(LineNr + 5);
Item := TextBetween(Line, ' ', ' min.');
HTMLDecode(Item);
SetField(fieldLength, Trim(Item));
end;
// País
LineNr := FindLine('<img src="/imgs/countries', Page, LineNr);
if LineNr <> -1 then
begin
Line := Page.GetString(LineNr);
Item := TextBetween(Line, ' title="', '" border');
HTMLDecode(Item);
SetField(fieldCountry, Trim(Item));
end;
// Director
LineNr := FindLine('<th>DIRECTOR</th>', 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);
Item := StringReplace(Item, ' (Creator)', '');
if Directors = '' then
Directors := Item
else
Directors := Directors + ', ' + Item;
end;
SetField(fieldDirector, Trim(Directors));
end;
// Guión
LineNr := FindLine('<th>GUIÓN</th>', 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;
// Compositor
LineNr := FindLine('<th>MÚSICA</th>', 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;
// Fotografía
LineNr := FindLine('<th>FOTOGRAFÍA</th>', 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;
// Intérpretes
LineNr := FindLine('<th>REPARTO</th>', 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('<th>PRODUCTORA</th>', Page, LineNr);
if LineNr <> -1 then
begin
Line := Page.GetString(LineNr + 1);
Item := TextBetween(Line, '<td>', '</td>');
HTMLDecode(Item);
SetField(fieldProducer, Trim(Item));
end;
// Webpage
LineNr := FindLine('<th>WEB OFICIAL</th>', 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;
// Premios
LineNr := FindLine('<th>PREMIOS</th>', 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;
// Género
LineNr := FindLine('<th>GÉNERO</th>', Page, LineNr);
if LineNr <> -1 then
begin
Item := '';
Line := Page.GetString(LineNr + 2);
while Pos('style="text-decoration:none">', Line) > 0 do
Item := Item + TextBetween(Line, 'style="text-decoration:none">', '</a>') + ', ';
HTMLDecode(Item);
SetField(fieldCategory, Left(Item, Length(Item) - 2));
end;
// Sinopsis
LineNr := FindLine('th>SINOPSIS</th>', Page, LineNr);
if LineNr <> -1 then
begin
Line := Page.GetString(LineNr + 1);
Item := TextBetween(Line, '<td>', '</td>');
HTMLDecode(Item);
SetField(fieldDescription, Trim(Item));
end;
// Críticas
LineNr := FindLine('<th>CRÍTICAS</th>', Page, LineNr);
if LineNr <> -1 then
begin
Comments := Comments + 'Críticas: ' + #13#10;
LineNr := LineNr + 3;
Item := Page.GetString(LineNr);
while Pos ('</tr>', Item) = 0 do
begin
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 + DeleteTags(Item);
LineNr := LineNr + 1;
Item := Page.GetString(LineNr);
end;
end;
// Carátula
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;
if (GetOption('Cover') = 1) then
AnalyzeCoversPage('http://www.google.es/search?num=100&hl=es&as_qdr=all&q=+%22' + UrlEncode(MovieName)+'%22+site%3A' + CoverURL1 + '&btnG=B%C3%BAsqueda&meta=', CoverAdress);
// Valoración
LineNr := FindLine('<div style="margin: 4px 0; color:#990000; font-size:22px; font-weight: bold;">', Page, LineNr);
if LineNr <> -1 then
begin
Line := Page.GetString(LineNr);
Item := TextBetween(Line, '<div style="margin: 4px 0; color:#990000; font-size:22px; font-weight: bold;">', '</div>');
HTMLDecode(Item);
SetField(fieldRating, Item);
end;
HTMLDecode(Comments);
SetField(fieldComments, CoverAdress + Comments);
end;
//------------------------------------------------------------------------------------
begin
MovieName := GetField(fieldTranslatedTitle);
if MovieName = '' then
MovieName := GetField(fieldOriginalTitle);
if (GetOption('AutoSelect') = 0) or (MovieName = '') then
if Input('Importador de FilmAffinity', 'Pelicula:', MovieName) = False then
exit;
AnalyzePage(BaseURL1 +'/es/search.php?stext=' + UrlEncode(MovieName) + '&stype=Title');
//www.filmaffinity.com/es/search.php?stext=Instinto&stype=Title
end.