(*************************************************** Ant Movie Catalog importation script www.antp.be/software/moviecatalog/ [Infos] Authors=Andrea Cristaudo (achris@tiscalinet.it) & Stefano Mora (stefano.mora@libero.it) & Necrodeath Title=Cinematografo.it Description=Script per il sito Cinematografo.it Site=http://www.cinematografo.it Language=IT Version=1.14 - 09.03.2010 Requires=3.5.0 Comments=(c) 2003 Andrea Cristaudo (achris@tiscalinet.it)|(c) 2009 Stefano Mora (stefano.mora@libero.it)|(c) 2005 Necrodeath 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=1|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' ***************************************************) program Cinematografo; var MovieName: 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 rendendola tutto minuscolo a parte la prima lettera function PrimaMaiu(str: string): string; begin str := trim(str); str := AnsiLowerCase(str); Result := AnsiUpFirstLetter(str); end; // -- 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 FillInput(Page: TStringList; LineNr: Integer; Salto: Integer; Field: Integer): Integer; var Line: string; begin LineNr := LineNr + Salto; // Sostituzione
// Sotituito con un case (codice + leggibile) --- Necrodeath (2005) case Field of fieldActors: Line := StringReplace(Page.GetString(LineNr), '
', '@'); fieldDirector: Line := StringReplace(Page.GetString(LineNr), '
', ', '); fieldCategory, fieldCountry: Line := StringReplace(Page.GetString(LineNr), '
', '/'); else Line := StringReplace(Page.GetString(LineNr), '
', #13#10); end; HTMLRemoveTags(Line); HTMLDecode(Line); Line := Trim(RemoveTabs(Line)); // Correzione maiuscole/minuscole if Field = fieldActors then begin Line := StringReplace(Line, ' ', ': '); // Condizione per eliminare il nome del personaggio a destra dell'attore --- Necrodeath (2005) case GetOption('NoPersonaggio') of 1: Begin Line := Line + '@'; Line := TogliPersonaggio(Line); end; end; Line := StringReplace(Line, '@', ', '); Line := PrimeMaiu(Line); end // --- else if (Field = fieldOriginalTitle) then begin Line := PrimaMaiu(Line); end else if (Field = fieldDirector) or (Field = fieldProducer) or (Field = fieldCountry) or (Field = fieldCategory) then Line := PrimeMaiu(Line); Line := StringReplace(Line, ' ', ' '); Line := StringReplace(Line, ' ', ' '); SetField(Field, Line); Result := LineNr; 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; 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 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 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; act: string; LineNr: Integer; BeginPos, EndPos: Integer; Field: integer; begin //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); 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); SetField(fieldTranslatedTitle, PrimaMaiu(Line) ); SetField(fieldOriginalTitle, PrimaMaiu(Line) ); 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); SetField(fieldOriginalTitle, PrimaMaiu(Line2)); end; // Cerca l'anno LineNr := FindLine('>Anno<', Page, 0); if LineNr > -1 then begin Line := Page.GetString(LineNr+3); HTMLRemoveTags(Line); SetField(fieldYear, Line); 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); 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)); 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)); 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#13#10; 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); line2 := copy(Line,BeginPos,EndPos-BeginPos); Line2 := StringReplace(Line2, '  ', ''); HTMLRemoveTags(Line2); HTMLDecode(Line2); Line2 := StringReplace(Line2, ' ', ' '); SetField(fieldDirector, Trim(Line2)); end; // Attori LineNr := FindLine('>Attori<', Page, 0); if LineNr > -1 then begin Line := Page.GetString(LineNr); //ShowMessage ('ATT:'+Line); BeginPos := pos('>Attori<', Line)+78; Delete(Line, 1, BeginPos); BeginPos := 1; EndPos := pos('Soggetto', Line)+11; line2 := copy(Line,BeginPos,EndPos-BeginPos); Line2 := StringReplace(Line2, '', ' ('); //ShowMessage ('ATT:'+Line2); Line2 := StringReplace(Line2, '', '), '); //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 Line2 := Stringreplace(Line2, '))', ')'); BeginPos := pos(' (', Line2); while BeginPos<>0 do begin EndPos := pos(')', Line2); Delete( Line2, BeginPos, EndPos-BeginPos+1); BeginPos := pos(' (', Line2); //ShowMessage (Line2); end; end; Line2 := StringReplace(Line2, ', Soggetto', '.'); //ShowMessage (Line2); SetField(fieldActors, Line2); end; // Critica 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('


', #13#10#13#10 ); //ShowMessage (Line2); SetField(fieldComments, Line2); 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('

', Line); line2 := copy(Line,BeginPos,EndPos-BeginPos); HTMLRemoveTags(line2); HTMLdecode(line2); line2 := trim(line2); SetField(fieldDescription, line3+Line2); //ShowMessage(line3+line2); 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('', Line); EndPos := pos('
', 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.