[REL] FilmAffinity (+CaratulaDVD) (ES).ifs

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
morfius
Posts: 26
Joined: 2011-11-10 13:01:06

[REL] FilmAffinity (+CaratulaDVD) (ES).ifs

Post by morfius »

Hi, script for fix and add new options. DVD Cover's avaible from Caratula Info

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.
Post Reply