Page 1 of 1

[UPD ITA] Cinematografo.it

Posted: 2012-11-10 05:27:44
by fulvio53s03
Updated actors name's extraction.
Aggiornata l'estrazione degli attori.
(Yesterday's version contained a mistake) :(

Code: Select all

(***************************************************

Ant Movie Catalog importation script
www.antp.be/software/moviecatalog/

[Infos]
Authors=Andrea Cristaudo (<link>achris@tiscalinet.it</link>) & Stefano Mora (<link>stefano.mora@libero.it</link>) & Necrodeath & AttSta (<link>supertramp7@gmail.com</link>) & Fulvio53s03
Title=Cinematografo.it
Description=Script per il sito Cinematografo.it
Site=http://www.cinematografo.it
Language=IT
Version=1.17 - 09.11.2012 Fulvio53s03
Requires=3.5.0
Comments=(c) 2003 Andrea Cristaudo (<link>achris@tiscalinet.it</link>)|(c) 2005 Necrodeath|(c) 2009 Stefano Mora (<link>stefano.mora@libero.it</link>)|(c) 2012 AttSta (<link>supertramp7@gmail.com</link>)|(c) 2012 Fulvio53s03
License=This program is free software; you can redistribute it and/or modify it under the  terms of the GNU General Public License as published by the Free Software Foundation;  either version 2 of the License, or (at your option) any later version. |
GetInfo=1

[Options]
NoPersonaggio=0|1|1=Non riporto il nome del personaggio|0=Riporto il nome del personaggio
NoTrattoDa=0|0|1=Non inserisco la descrizione 'Tratto da'|0=Includo l'eventuale descrizione 'Tratto da'
NoNote=0|0|1=Non riporto le 'Note'|0=Riporto le 'Note'

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

program Cinematografo;
var
  MovieName, titolo_tradotto, titolo_originale: string;
  idx : integer;

const
  PATHLOG = 'c:\Programmi\Ant Movie Catalog\Log\Cinematografo\';
  //MOVIE = '';
  SITE = 'http://www.cinematografo.it';
  SITE1 = 'http://www.cinematografo.it/bancadati/consultazione/';
  SITE3 = '&completa=si';
  
// -- Formatta la stringa cercando le prime lettere rendendole maiuscole
function PrimeMaiu(str: string): string;
begin
  str := AnsiLowerCase(str);
  str := AnsiMixedCase(str, ' -/');
  Result := str;
end;

// ---

function RemoveTabs(Pattern: string): string;
begin
  repeat
    Delete(Pattern, 1, 1);
  until ord(copy(Pattern, 1, 1)) <> 9;
  result := Pattern;
end;

function Space2html(Url: string): string;
var
  Temp : string;
  SpacePos : Integer;
begin
  repeat
    SpacePos := pos(' ', Url);
    if SpacePos <> 0 then
      begin
        Temp := copy(Url, 1, SpacePos -1);
        Delete(Url, 1, SpacePos);
        Temp := Temp + '%20' + Url;
        Url := Temp;
      end;
  until pos(' ', Url) = 0;

  result := Url;
end;

//Elimina il personaggio interpretato dall'attore --- Necrodeath (2005)

Function TogliPersonaggio(Line : string) : string;
var
  lunghezza, i : integer;
  tmp, t: string;
  elimino : boolean;
  
Begin
  lunghezza := length(Line);
  i := 0;
  
  while i <= lunghezza do
  Begin
    i := i+1;
    tmp := copy(Line, i, 1);
    elimino := false;
    if (tmp = ':')  then
      Begin
        elimino := true;
        while elimino = true do
          Begin
            tmp := copy(Line, i, 1);
            i := i+1;
            if (tmp = '@') then
              Begin
                if (i <>  lunghezza + 1) then
                  begin
                    t := t + tmp;
                  end
              elimino := false;
            end;
          end;
      end
    else
      Begin
        t := t + tmp;
    end;
  end;
  TogliPersonaggio := t;
end;


// ---


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;

// ----
// Analizza la lista dei risultati ricerca
procedure AnalyzeResults(Address: string);
var
  Page: TStringList;
  LineNr: integer;
  BeginPos: integer;
  Line: string;
  xPos: integer;
  yPos: integer;
begin
  //ShowMessage(Address);
  Page := TStringList.Create;
  Page.Text := GetPage(Address);
  idx := 0;

  // Debug
  //Page.SaveToFile(PATHLOG+MovieName+'.lst');
  //Page.LoadFromFile(PATHLOG+MOVIE+'.res0');
  //AnalyzeMoviePage(Page);
  //exit procedure;
  // Debug
  
  LineNr := FindLine('>0</b> risultati per ricerca', Page, 0);
  if LineNr <> -1 then
  begin
    ShowError('Spiacente, nessun film trovato');
  end
  else  // Trovati film ! Nota: possono esserci + pagine -> non ancora gestito !
  begin
    // Crea la lista di film
    PickTreeClear;
    PickTreeAdd('Risultati ricerca per "' + MovieName + '":', '');
    AddMoviesTitles(Page);
    if PickTreeExec(Address) then
      begin
        // Elimina il jsessionid dall'URL --- AttSta (2010)
        xPos := pos(';', Address);
        yPos := pos('?', Address);
        if (xPos > 0) then
        begin
          if xPos < yPos then
          begin
            Address := copy(Address,1,xPos-1) + copy(Address,yPos,length(Address));
          end
          else
      begin
            Address := copy(Address,1,xPos-1);
          end;
        end;
        // ---
        SetField(fieldURL, Address);    // Memorizza il campo URL
        // La pagina viene ridiretta quindi costruisco il nuovo Address
        Page.Text := GetPage(Address);  // Richiede la pagina che verrà ridiretta
        // Page.SaveToFile(PATHLOG+MovieName+'Redir.page');
        LineNr := FindLine('sch=', Page, 0);
        if LineNr = -1 then
        begin
          ShowError('Errore nella pagina rediretta');
          Page.Free;
          exit;
        end
        Line := Page.GetString(LineNr);   // Recupera il codice del film
        BeginPos := pos('sch=', Line)+3;
        Delete(Line, 1, BeginPos);
        BeginPos := pos('"', Line);
        Line := copy(Line, 1, BeginPos - 1);
        
        Address := SITE1+'/schedafilm_2009.jsp?codice='+Line+SITE3;
        // ShowMessage(Address);
        Page.Text := GetPage(Address);  // Richiede la pagina del film
        AnalyzeMoviePage(Page);         // Analizza la pagina del film
      end;
  end;
  Page.Free;
end;

// ---
// Analisi ed estrazione dati dalla pagina del film
procedure AnalyzeMoviePage(Page: TStringList);
var
  Line: string;
  Line2: string;
  Line3: string;
  Line4: string;
  act: string;
  LineNr: Integer;
  BeginPos, EndPos: Integer;
  Field: integer;
  ErrorMsg: string;
begin

  ErrorMsg := '';

  //Debug
  //Page.SaveToFile(PATHLOG+MovieName+'.film');
  //Page.LoadFromFile(PATHLOG+Movie+'.film');

  // Immagine
  LineNr := FindLine('class="imgScheda"', Page, 0);
  if LineNr>-1 then
  begin
    Line := Page.GetString(LineNr);
    if pos('src="', Line) <> 0 then
    begin
        BeginPos := pos('src="', Line);
        Delete(Line, 1, BeginPos + 4);
        EndPos := pos('" ', Line);
        Line := SITE1 + copy(Line, 1, EndPos - 1);
        Line := Space2html(Line);
        //  ShowMessage(Line);
        GetPicture(Line);
        // Verifica eventuali scarti --- AttSta (2010)
        if length(Line)=0 then
        begin
          ErrorMsg := ErrorMsg + #13#10 + 'Immagine';
        end;
        // ---
    end;
  end;

  // Cerca il titolo
  LineNr := FindLine('"td_titolo"', Page, 0);
  if LineNr > -1 then
  begin
    //Estrae titolo
    Line := Page.GetString(LineNr+1);
    //ShowMessage(Line);
    HTMLRemoveTags(Line);
    Line := Trim(Line);
    titolo_tradotto := AnsiMixedCase(AnsiLowerCase(Line), ' ');
    titolo_originale := titolo_tradotto;
    SetField(fieldTranslatedTitle, titolo_tradotto);
    SetField(fieldOriginalTitle, titolo_tradotto);
  end;

  // Cerca il titolo originale
  LineNr := FindLine('>Titolo Originale<', Page, 0);
  if LineNr > -1 then
  begin
    //Estrae titolo originale
    Line2 := Page.GetString(LineNr+3);
    HTMLRemoveTags(Line2);
    Line := Trim(Line2);
    // ShowMessage(Line2);
    titolo_originale := AnsiMixedCase(AnsiLowerCase(Line), ' ');
  end;
    if  titolo_originale <> titolo_tradotto then
        SetField(fieldOriginalTitle, titolo_originale)
        else
        SetField(fieldOriginalTitle, '');

  // Cerca l'anno
  LineNr := FindLine('>Anno<', Page, 0);
  if LineNr > -1 then
  begin
    Line := Page.GetString(LineNr+3);
    HTMLRemoveTags(Line);
    SetField(fieldYear, Line);
    // Verifica eventuali scarti --- AttSta (2010)
    if length(Line)=0 then
    begin
      ErrorMsg := ErrorMsg + #13#10 + 'Anno';
    end;
    // ---
  end;

  // Cerca la durata
  LineNr := FindLine('>Durata<', Page, 0);
  if LineNr > -1 then
  begin
    Line2 := Page.GetString(LineNr+3);
    // ShowMessage('Dur:'+Line2);
    HTMLRemoveTags(Line2);
    line2 := trim(line2);
    SetField(fieldLength, Line2);
    // Verifica eventuali scarti --- AttSta (2010)
    if length(Line2)=0 then
    begin
      ErrorMsg := ErrorMsg + #13#10 + 'Durata';
    end;
    // ---
  end;

  // Nazione
  LineNr := FindLine('>Origine<', Page, 0);
  if LineNr > -1 then
  begin
    Line := Page.GetString(LineNr+3);
    HTMLRemoveTags(Line);
    SetField(fieldCountry, PrimeMaiu(Trim(Line)));
  end;

  // Cerca genere
  LineNr := FindLine('>Genere<', Page, 0);
  if LineNr > -1 then
  begin
    Line2 := Page.GetString(LineNr+3);
    //ShowMessage(Line2);
    HTMLRemoveTags(Line2);
    Line2 := Trim(Line2);
    SetField(fieldCategory, PrimeMaiu(Line2));
    // Verifica eventuali scarti --- AttSta (2010)
    if length(Line2)=0 then
    begin
      ErrorMsg := ErrorMsg + #13#10 + 'Genere';
    end;
    // ---
  end;
  
  LineNr := FindLine('>Produzione<', Page, 0);
  if LineNr > -1 then
  begin
    // Produzione/Distribuzione
    Line := Page.GetString(LineNr+3);
    HTMLRemoveTags(line);
    line := Trim(line);
    //ShowMessage('Distr:'+Line);
    SetField(fieldProducer, PrimeMaiu(Line));
    // Verifica eventuali scarti --- AttSta (2010)
    if length(Line)=0 then
    begin
      ErrorMsg := ErrorMsg + #13#10 + 'Produzione/Distribuzione';
    end;
    // ---
  end;

  // Tratto da ... (opzionale)
  Line3 := '';
  if GetOption('NoTrattoDa')=0 then
  begin
    LineNr := FindLine('>Tratto da<', Page, 0);
    if LineNr > -1 then
    begin
      line := Page.GetString(LineNr+3);
      // ShowMessage(line);
      line3 := trim(line);
//      line3 := 'Tratto da: ' + line3 + #13#10;
      line3 := line3 + #13#10;
      // Verifica eventuali scarti --- AttSta (2010)
      if length(line3)=0 then
      begin
        ErrorMsg := ErrorMsg + #13#10 + 'Tratto da';
      end;
      // ---
    end;
  end;
  
  // Aggiunge Note ai Commenti --- AttSta (2010)

  // Note ... (opzionale)
  Line4 := '';
  if GetOption('NoNote')=0 then
  begin
    LineNr := FindLine('>Note<', Page, 0);
    if LineNr > -1 then
    begin
      Line := Page.GetString(LineNr);
      // ShowMessage (Line);
      BeginPos := pos('>Note<', Line)+35;
      Delete(Line, 1, BeginPos);
      BeginPos := 1;
      EndPos := pos('</font>', Line);
      Line := copy(Line,BeginPos,EndPos-BeginPos);
      Line4 := trim(Line);
      Line4 := StringReplace(Line4, '<br>', #13#10);
      if copy(Line4,1,1)='-' then
      begin
        Line4 := #13#10 + Line4;
      end;
      HTMLRemoveTags(Line4);
      HTMLDecode(Line4);
      Line4 := 'Note: ' + Line4;
      //ShowMessage ('['+Line4+']');
      // Verifica eventuali scarti --- AttSta (2010)
      if length(Line4)=0 then
      begin
        ErrorMsg := ErrorMsg + #13#10 + 'Note';
      end;
      // ---

    end;
  end;

  // Cerca regia
  LineNr := FindLine('>Regia<', Page, 0);
  if LineNr > -1 then
  begin
    Line := Page.GetString(LineNr);
    BeginPos := pos('_top', Line)+5;
    delete( line, 1, beginpos); beginpos:=1;
    EndPos := pos('fontViolaB', Line);
//fs2012.04.02    line2 := copy(Line,BeginPos,EndPos-BeginPos);
//fs2012.04.02    Line2 := StringReplace(Line2, ' <a href', ', <a href');
//fs2012.04.02    Line2 := StringReplace(Line2, 'width="100%"> ', '');
    Line2 := line;       //fs2012.04.02
    HTMLRemoveTags(Line2);
    HTMLDecode(Line2);
    Line2 := StringReplace(Line2, '  ', ' ');
    Line2 := StringReplace(Line2, '")', '"),  ');
    SetField(fieldDirector, Trim(Line2));
    // Verifica eventuali scarti --- AttSta (2010)
    if length(Trim(Line2))=0 then
    begin
      ErrorMsg := ErrorMsg + #13#10 + 'Regia';
    end;
    // ---

  end;

  // Attori
  LineNr := FindLine('>Attori<', Page, 0);
  if LineNr > -1 then
  begin
    Line := Page.GetString(LineNr);
    //ShowMessage ('ATT:'+Line);
    BeginPos := pos('>Attori<', Line)+6;     //fs era +78
    Delete(Line, 1, BeginPos);
    BeginPos := 1;
    EndPos := pos('Soggetto', Line)+11;
    line2 := copy(Line,BeginPos,EndPos-BeginPos);

    Line2 := StringReplace(Line2, '<div class="fontYellow">', ' (');
    Line2 := StringReplace(Line2, '</div>  <a href=', '),________* <a href=');
    //ShowMessage ('ATT:'+Line2);
    Line2 := StringReplace(Line2, '</tr><tr>', '), ');
    //ShowMessage ('ATT:'+Line2);
    HTMLRemoveTags(Line2);
    HTMLDecode(Line2);
    Line2 := StringReplace(Line2, '  ', ' ');
    Line2 := StringReplace(Line2, '  ', ' ');
    Line2 := StringReplace(Line2, '  ', ' ');
    //if Line2<>'' then Line2 := Trim(Line2) + ')';
    //ShowMessage ('ATT:'+Line2);

    if GetOption('NoPersonaggio')=1 then
    begin
//fs 2012.04.02      Line2 := Stringreplace(Line2, '))', ')');
      Line2 := Stringreplace(Line2, '))', '), ');              //fs 2012.04.02
      Line2 := Stringreplace(Line2, ') ', '), ');              //fs 2012.04.02
      BeginPos := pos(' (', Line2);
      while BeginPos<>0 do
      begin
        EndPos := pos(')', Line2);
        Delete( Line2, BeginPos, EndPos-BeginPos+1);
        BeginPos := pos(' (', Line2);
        //ShowMessage (Line2);
      end;
    end;

    if GetOption('NoPersonaggio')=0 then
    begin
//fs 2012.04.02      Line2 := Stringreplace(Line2, '))', ')');
      Line2 := Stringreplace(Line2, '))', '), ');              //fs 2012.04.02
      Line2 := Stringreplace(Line2, ') ', '), ');              //fs 2012.04.02
      Line2 := Stringreplace(Line2, '( ', '(');                //fs 2012.04.02
    end;

    Line2 := StringReplace(Line2, ', Soggetto', '.');
    Line2 := StringReplace(Line2, ', ).', '.');                 //fs 2012.04.02
    Line2 := StringReplace(Line2, ',  ).', '.');                //fs 2012.04.02
    Line2 := StringReplace(Line2, '_', ' ');                    //fs 2012.11.09
    Line2 := Stringreplace(Line2, ' ()', '');
    //ShowMessage (Line2);
    SetField(fieldActors, Line2);
  end;
  // Critica
  Line2 := '';
  LineNr := FindLine('>Critica<', Page, 0);
  if LineNr > -1 then
  begin
    Line := Page.GetString(LineNr);
    // ShowMessage ('ATT:'+Line);
    BeginPos := pos('>Critica<', Line)+15;
    Delete(Line, 1, BeginPos);
    BeginPos := 1;
    EndPos := pos('<br><br><font ', Line);
    // Verifica terminazione campo Critica --- AttSta (2010)
    // Se non era presente il campo Note, saltava tutto il campo Critica
    if EndPos = 0 then
    begin
      Line2 := StringReplace(Line, '<br><br>', #13#10 );
      HTMLRemoveTags(Line2);
      //ShowMessage ('['+Line2+']');
    end
    else //if EndPos > 0 then
    begin
    line2 := copy(Line,BeginPos,EndPos-BeginPos);
    //ShowMessage ('ATT:'+Line);
    Line2 := StringReplace(Line2, '<br><br>', #13#10 );
    // ---
    HTMLRemoveTags(Line2);
    HTMLDecode(Line2);
    // Verifica eventuali scarti --- AttSta (2010)
    if length(Line2)=0 then
    begin
      ErrorMsg := ErrorMsg + #13#10 + 'Critica';
    end;
    // ---
  end;

  // Formatta i campi Critica + Note --- AttSta (2010)
  if length(Line2) > 0 then
  begin
    if length(Line4) > 0 then
    begin
      SetField(fieldComments, line3 + Line2 + #13#10 + Line4);
    end
    else
    begin
      SetField(fieldComments, line3 + Line2);
    end;
  end
  else
  begin
    if length(Line4) > 0 then
    begin
      SetField(fieldComments, line3 + Line4);
    end;
  end;
  // ---
  end;

  // Trama
  LineNr := FindLine('>Trama<', Page, 0);
  if LineNr > -1 then
  begin
    Line := Page.GetString(LineNr);
    //ShowMessage('T:'+line);
    BeginPos := pos('>Trama<', Line)+5;
    Delete( Line, 1, BeginPos);
    BeginPos := 1;
    // ShowMessage('T:'+line);
    EndPos := pos('</font><br>', Line);
    line2 := copy(Line,BeginPos,EndPos-BeginPos);
    // Gestisce Trama Breve/Trama Lunga --- AttSta (2010)
    if pos('TRAMA LUNGA<br>', line2) > 0 then
    begin
      line2 := StringReplace(line2, 'TRAMA LUNGA<br>', #13#10 +'TRAMA LUNGA:'+#13#10);
      //ShowMessage('['+line2+']');
      if (pos('TRAMA BREVE<br>', line2) > 0) or (pos('TRAMA CORTA<br>', line2) > 0) then
      begin
        //ShowMessage('['+line2+']');
        line2 := StringReplace(line2, 'TRAMA BREVE<br>', 'TRAMA BREVE:'+#13#10);
        line2 := StringReplace(line2, 'TRAMA CORTA<br>', 'TRAMA BREVE:'+#13#10);
        //ShowMessage('['+line2+']');
      end
      else
      begin
        HTMLRemoveTags(line2);
        HTMLdecode(line2);
        line2 := trim(line2);
        line2 := 'TRAMA BREVE:' + #13#10 + line2;
      end;
    end
    else
    begin
      line2 := StringReplace(line2, 'TRAMA BREVE<br>', 'TRAMA BREVE:'+#13#10);
    end;
    // ---
    HTMLRemoveTags(line2);
    HTMLdecode(line2);
    line2 := trim(line2);
//    SetField(fieldDescription, line3+Line2);
    SetField(fieldDescription, Line2);
    //ShowMessage(line3+line2);
    // Verifica eventuali scarti --- AttSta (2010)
    if length(Line2)=0 then
    begin
      ErrorMsg := ErrorMsg + #13#10 + 'Trama';
    end;
    // ---
  end;

  // Stampa messaggio di eventuali scarti --- AttSta (2010)
  if length(ErrorMsg)>0 then
  begin
    ShowMessage('Possibili errori sui campi:' + ErrorMsg);
  end;
end;

// ---
// Riempie la lista con i film trovati
procedure AddMoviesTitles(Page: TStringList);
var
  LineNr: Integer;
  Line: string;
  MovieTitle, MovieAddress: string;
  BeginPos, EndPos: Integer;
  Pagina: TStringList;

begin
 repeat

  LineNr := 0;
  LineNr := FindLine('href="schedafilm',Page,LineNr);
  Line := Page.GetString(LineNr);
  // ShowMessage(Line);
  
  // I titoli sono tutti sulla stessa riga
  BeginPos := pos('"schedafilm',Line);  // Punta all'inizio id scheda
  while BeginPos > 0 do
  begin
    Delete(Line, 1, BeginPos);      // Cancella tutti i char precedenti
    
    BeginPos := 1;            // Nuovo inizio
    EndPos := pos('">',Line); // Fine url

    // Crea l'url per la pagina completa del film
    MovieAddress := SITE1 + copy(Line,BeginPos,EndPos-BeginPos) + SITE3;
    // ShowMessage(MovieAddress);

    // Estrazione nome film + anno
    BeginPos := pos('<b>', Line);
    EndPos := pos('</a>', Line);
    MovieTitle := AnsiUpFirstLetter(copy(Line,BeginPos,EndPos-BeginPos));
    // Ripulisce il titolo
    HTMLRemoveTags(MovieTitle);
    HTMLDecode(MovieTitle);
    PickTreeAdd(MovieTitle, MovieAddress);
    
    // Prossimo film nella stringa
    Delete( Line, 1, EndPos);
    BeginPos := pos('"schedafilm',Line);  // Punta all'inizio id scheda

  end;  // while
  
  // Controlla se ci sono altre pagine di risultati
  LineNr := FindLine('Pagina Successiva',Page,0);
  if LineNr<>-1 then
    begin
    idx := idx+1;

    Line := Page.GetString(LineNr);
    // Estrae l'URL della pagina successiva
    BeginPos := pos('href="', Line)+5;
    Delete( Line, 1, BeginPos);
    BeginPos := 1;
    EndPos := pos('"', Line);
    Line := SITE1 + copy(Line, BeginPos, endPos-BeginPos);
    //ShowMessage(Line);
    // Richiama la pagina successiva e la analizza
    Page.text := GetPage(Line);
    end;

  until (LineNr=-1); // repeat
  
end;


// ----- main()

Var
  TempVar: String;
begin
  if CheckVersion(3,5,0) then
  begin
    MovieName := GetField(fieldTranslatedTitle);
    if MovieName = '' then
      MovieName := GetField(fieldOriginalTitle);
    if Input('Cinematografo.it', 'Nome del film:', MovieName) then
    begin
      TempVar := 'http://wwwd.cinematografo.glauco.it/bancadati/consultazione/trovatitoli.jsp?word='+UrlEncode(MovieName)+'&tipo=CONTIENEPAROLE&I2.x=13&I2.y=11';
      AnalyzeResults(TempVar);
    end;
  end
  else
    ShowMessage('This script requires a newer version of Ant Movie Catalog (at least the version 3.5.0)');
end.
:)

Posted: 2012-11-11 16:27:19
by antp
Thanks :)