[REL] FilmAffinity [ES] - Version 50 % Nueva

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
gilistico
Posts: 22
Joined: 2005-12-12 18:09:27

[REL] FilmAffinity [ES] - Version 50 % Nueva

Post by gilistico »

Era uno de los scripts que más me gustaban pero fallaba en la busqueda de algunas peliculas; por ejemplo, al buscar "Monster" solo aparecia uno de los cinco resultados que proporciona la pagina web.

Total que decidí modificar toda la busqueda de películas y aproveche para corregir algunos pobremas, como que se quedaba buscando actores a perpetuidad (en "Cabin Fever", por ejemplo, al tener la pagina html varias lineas de actores).

Al ser un cambio profundo (del 50%) le he puesto como versión la 2.1, espero que no os importe.

FilmAffinity (ES).ifs

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.1
Requires=3.5.0
Comments=Updated to the new beta version of the page | Previous version is unsupported.
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]

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

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>TITULO ORIGINAL</b>', Page, 0);
	if LineNr <> -1 then
	begin
		Line := Page.GetString(LineNr + 1);
		MovieTitle := TextBetween (Line, '<td ><b>', '</b></td>');
		HTMLDecode(MovieTitle);
		PickTreeAdd(MovieTitle, Address);

      		if PickTreeExec(Address) then
        		AnalyzeMoviePage(Address);
  		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, aux: 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('TITULO ORIGINAL', Page, 0);
  if LineNr <> -1 then
  begin
    Line := Page.GetString(LineNr + 1);
    Item := TextBetween (Line, '<td ><b>', '</b></td>');
    HTMLDecode(Item);
    SetField(fieldOriginalTitle, Trim (Item));
  end;

  // Picture
  LineNr := FindLine('images.filmaffinity.com/movies/', Page, 0);
  if LineNr <> -1 then
  begin
     Line := Page.GetString(LineNr);
     Item := TextBetween (Line, '<img src="', '"></td></tr>');
     GetPicture (Item);
  end;

  // Year
  LineNr := FindLine('AÑO', Page, 0);
  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('DURACIÓN', Page, 0);
  if LineNr <> -1 then
  begin
    Line := Page.GetString(LineNr + 1);
    Item := TextBetween (Line, '<td >', ' min.</td>');
    HTMLDecode(Item);
    SetField(fieldLength, Trim (Item));
  end;

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

  // Director
  LineNr := FindLine('DIRECTOR', Page, 0);
  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('GUIÓN', Page, 0);
  if LineNr <> -1 then
  begin
    Line := Page.GetString(LineNr + 1);
    Item := TextBetween (Line, '<td >', '</td>');
    Comments := Comments + 'Guión: ' + Item + #13#10;
  end;

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

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

  // Actors
  LineNr := FindLine('REPARTO', Page, 0);
  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('PRODUCTORA', Page, 0);
  if LineNr <> -1 then
  begin
    Line := Page.GetString(LineNr + 1);
    Item := TextBetween (Line, '<td  >', '</td>');
    HTMLDecode(Item);
    SetField(fieldProducer, Trim (Item));
  end;

  // Critic
  LineNr := FindLine('GÉNERO Y CRÍTICA', Page, 0);
  if LineNr <> -1 then
  begin
    Line := Page.GetString(LineNr + 1);
    HTMLDecode(Line);
    Line := Copy (Page.Text, 1, Length (Page.Text));
    Line := StringReplace(Line, '<br />', #13#10);
    Item := TextBetween (Line, 'GÉNERO Y CRÍTICA</b></td>', '</tr>');
    Item := TextBetween (Item, '<td  >', '</td>');
    Item := StringReplace (Item, 'á','á');
    Item := StringReplace (Item, 'é','é');
    Item := StringReplace (Item, 'í','í');
    Item := StringReplace (Item, 'ó','ó');
    Item := StringReplace (Item, 'ú','ú');
    Item := StringReplace (Item, 'Á','Á');
    Item := StringReplace (Item, 'É','É');
    Item := StringReplace (Item, 'Í','Í');
    Item := StringReplace (Item, 'Ó','Ó');
    Item := StringReplace (Item, 'Ú','Ú');
    Item := StringReplace (Item, '"','');
    Item := StringReplace (Item, 'ñ','ñ');
    Item := StringReplace (Item, '¿','¿');
    SetField(fieldDescription, Trim(Item));
  end;


   // Category
  LineNr := FindLine('GÉNERO Y CRÍTICA', Page, 0);
  if LineNr <> -1 then
  begin
    Line := Page.GetString(LineNr + 1);
    Item := TextBetween (Line, ' / ', ' / ');
   if Length(Item)> 100 then
     begin
        Line := Page.GetString(LineNr + 1);
        Item := TextBetween (Line, '<td  >', ' /');
     end;
    HTMLDecode(Item);
    SetField(fieldCategory, Trim (Item));
    
  end;
  
  // Official Webpage
  LineNr := FindLine('WEB OFICIAL', Page, 0);
  if LineNr <> -1 then
  begin
    Line := Page.GetString(LineNr + 1);
    Comments := Comments + 'Web oficial: ' + TextBetween (Line, '<a href="', '" target="_blank">') + #13#10;
  end;

  // Rating
  LineNr := FindLine('<td align="center" style="color:#990000; font-size:22px; font-weight: bold;">', Page, 0);
  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);

    	Input('FilmAffinity', 'Pelicula:', MovieName);

	AnalyzePage('http://www.filmaffinity.com/es/search.php?stext=' + UrlEncode(MovieName)  + '&stype=title');
end.
Last edited by gilistico on 2005-12-13 11:55:21, edited 2 times in total.
antp
Site Admin
Posts: 9629
Joined: 2002-05-30 10:13:07
Location: Brussels
Contact:

Post by antp »

Tanks for this update ;)
folgui
Posts: 113
Joined: 2003-02-04 19:15:03
Location: Madrid, Spain

Post by folgui »

Hi!

Great work gilistico for both scripts you've updated :grinking:

Regards, folgui.
kreti
Posts: 12
Joined: 2005-07-19 01:20:36

Post by kreti »

Aunque solo busqué 7 u 8 películas, me parece que todo va correcto.

Solo una cosa, y es que si solo se encuentra un resultado, muestra la lista con solo ese resultado con su título original. No muestra el título traducido, lo cual puede confundir. Pero además, obligas a pinchar sobre el único resultado para que vaya a la página. Yo prefería que ya fuese directamente.

Yo lo he hecho comentando las líneas de tu script

// PickTreeAdd(MovieTitle, Address);
// if PickTreeExec(Address) then

cuando solo hay un resultado. Estas líneas mostraba el único resultado y obligaban a pinchar sobre el.

Solo es una sugerencia. De todos modos, felicidades por el trabajo.
gilistico
Posts: 22
Joined: 2005-12-12 18:09:27

Post by gilistico »

kreti

obligas a pinchar sobre el único resultado para que vaya a la página
Es cuestión de gustos, yo siempre prefiero que se me muestren los resultados de la busqueda antes de acceder a ellos; por los siguientes motivos:

1.- Imaginate que estas buscando una pelicula cualquiera "Pelicula_cualquiera", que no existe en la web, pero en la cual si existen "Pelicula_cualquiera_3" o sucesivas. En este caso el único resultado que te muestra es el de otra pelicula, no el de la que tu buscas. Es mejor cortar antes de que procese la pagina, busque la imagen, etc.

2.- Imaginate que estas buscando una película, pero solo por parte del título y que en la web solo hay un resultado. Es siempre mejor ver que ha encontrado, antes de procesar la página, pues es probable que no se trate de la pelicula que buscas.

3.- En muchas ocasiones dentro de las páginas de las piliculas hay opiniones de usuarios, mejores que las criticas o reseñas oficiales de las webs. Cosa que ocurre bastante a menudo en cinefania, etc. Yo prefiero tener la oportunidad de "Ver la página", opción que solo tienes si se ejecuta PickTreeExec.

4.- En algunas ocasiones, la web en cuestión impide que se descargen las imagenes en tamaño ampliado desde aplicaciones del tipo Ant Movie Catalog que no tienen opción de modificar las cabeceras http. Para descargar esas imagenes ampliadas, la única opción es visualizar la pagina (nuevamente con PickTreeExec) y pinchar en la imagen deseada. Un ejemplo de estas webs es www.dvdgo.com.

Como dessarrollador tengo unos cuantos motivos más, pero en cualquier caso, yo siempre prefiero ver esa unica opción y tener la posibilidad de acceder a la página (PickTreeExec).

Un cordial saludo.
kreti
Posts: 12
Joined: 2005-07-19 01:20:36

Post by kreti »

Gilistico
Es cuestión de gustos...
Pues eso mismo. Yo cuando actualizo el catálogo, suelo hacerlo de 50 en 50, o así, y prefiero no perder el tiempo en hacer el click. Supongo que si solo actualizase 3 o 4 películas a la vez, no le daría mayor importancia.

Con respecto a lo que dices en los puntos 1 y 2, yo lo que hago es asegurarme, una vez que ya me bajó los datos y me los muestra todos antes de guardar, que se trata de la película correcta. Si no fuese, pincho en el botón "Saltar" y ya está.

Lo dicho en el anterior post. Solo era una sugerencia. Cada uno que eliga la opción que más le guste. Gracias de nuevo por la actualización del script.
Post Reply