[UPD ITA] Filmtv.it
Posted: 2013-02-11 09:09:05
Some minor changes to extract comments (Piccoli aggiustamenti per estrarre i commenti)
Code: Select all
(***************************************************
Ant Movie Catalog importation script
www.antp.be/software/moviecatalog/
[Infos]
Authors=Fulvio53s03 (based on Fiezul, PIvello, Valerino & others works).
Title=FilmTV
Description=Get movie info from Film TV
Site=www.Film.TV.it
Language=IT
Version=2.2.2 11.2.2013
Requires=3.5.1
Comments=
License=
GetInfo=1
RequiresMovies=1
[Options]
[Parameters]
***************************************************)
program FilmTVIt;
uses
StringUtils7552; // Script needs external unit StringUtils7552.pas in scripts folder !
const
//Query constants
UrlBase = 'http://www.film.tv.it/';
QueryBase = UrlBase + 'cerca.php?q=';
QueryFilm = UrlBase + '';
//Search page constants
Apice = #39;
cStartFilmUrl = '<div class="thumb"><a href="/'; // ID start marker
cEndFilmUrl = '"><span><img src='; // ID end marker
cStartTitle = 'title="'; // Title start marker
cEndTitle = '">'; // Title end marker
//Film page constants
cStartTranslTitle = '<h1 itemprop="name">'; // Translated title start marker
cEndTranslTitle = '</h1>'; // Translated title end marker
cStartOrigTitle = '[<i>'; // Original title start marker
cEndOrigTitle = '</i>'; // Original title end marker
cStartImgLink_ext = '<div id="filmScheda_sx">'; // Image start marker
cStartImgLink_int = '<img src="'; // Image start marker
cEndImgLink_int = '" width="'; // Image end marker
cEndImgLink_ext = '<div class="hvenv">'; // Image end marker
cStartListItem = ', ';
cEndCountry = '<a href="/film/anno';
cEndListItem = ', '; // Generic field marker
cStartCategory = '/">'; // Category start marker
cEndCategory = '</a>'; // Single Director end marker
cEndDirectors = '<br />'; // Directors end marker
cStartDirector = 'Regia di '; // Single Director start marker
cEndDirector = '</a>'; // Single Director end marker
cStartCast = 'Con'; // Cast start marker
cEndCast = '</div>'; // Cast end marker
cStartActor = '">'; // Actor start marker
cEndActor = '</a>'; // Actor end marker
cEndGeneric2 = '</td>'; // Generic end marker 2
cStartDesc = '<p class="trama" itemprop="description">'; // Description start marker //FS2012-11-11
// cStartDesc = '<p class="trama">'; // Description start marker //FS2012-11-11
cEndDesc = '</p>'; // Description end marker
// cStartComm = '<p class="commento">'; // Comment start marker
// cEndComm = '</p>'; // Comment end marker
cStartComm = '<div class="cx_opinione">'; //fs2013-02-11
cEndComm = '</div>'; // Comment end marker
cStartURL='<li id="sel"><a href="/';
cEndURL='" title="scheda"';
InitYear = '<span>';
EndYear = '</span>';
var
searchUrl,MovieUrl, MovieName, OriginalStr, TranslatedStr, PageStr: string;
MoviesFound: integer;
// --------------------------------------------------
// PAGE PACKING (remove extra spaces, tabs & CR) by Pivello
// IN: page Url (string)
// OUT: compact page (string)
// --------------------------------------------------
function RemoveExtraChars(Url: string): string;
var
Page: TStringList;
TmpPageStr: string;
Temp: string;
PackedPage: string;
CharPos: Integer;
n: Integer;
begin
Page := TStringList.Create;
TmpPageStr := '';
Page.Text := GetPage(Url);
for n := 0 to Page.Count - 1 do
PackedPage := PackedPage + ' ' + Page.GetString(n);
repeat
CharPos := pos(' ', PackedPage);
if CharPos = 0 then
CharPos := pos(#9, PackedPage);
if CharPos <> 0 then
begin
Temp := copy(PackedPage, 1, CharPos - 1);
Delete(PackedPage, 1, CharPos);
PackedPage := Temp + PackedPage;
end;
until((pos(' ', PackedPage) = 0) and (pos(#9, PackedPage) = 0));
result := PackedPage;
Page.Free;
end;
// -----------------------
// ANALYZE MOVIE DATA PAGE
// IN: none
// OUT: set Ant fields
// -----------------------
procedure SetMovieFields (htmlStr: string);
var
i, h, m: integer;
Duration, Description, Cast, TempStr, TempImg, hh, mm,temp: string;
tempDirector, director: string;
PosParAperta, PosParChiusa: integer;
anno: string;
imageLink: string;
sep1, sep2: string;
SaveHtmlstr, tempvar : string;
begin
SetField(fieldDate, DateToStr(Date));
// General movie description fields
anno := '';
TranslatedStr := getTextDelimited(cStartTranslTitle, cEndTranslTitle,htmlStr);
PosParAperta := pos('(', TranslatedStr);
PosParChiusa := pos(')', TranslatedStr);
if PosParChiusa = (PosparAperta + 5) then
begin
anno := copy(TranslatedStr, PosParAperta +1, (PosParchiusa - posParAperta -1));
Setfield(fieldYear, anno);
Delete(TranslatedStr, PosParAperta -1, PosParChiusa);
end
SetField(fieldTranslatedTitle, AnsiMixedCase(AnsiLowerCase(TranslatedStr), ' '));
SetField(fieldOriginalTitle, getTextDelimited(cStartOrigTitle, cEndOrigTitle,htmlStr));
if GetField(fieldOriginalTitle)='' then
sep1:='['
else
sep1:= cStartListItem;
//fs2012-04-06 tempvar:= getTextDelimited(sep1, cEndListItem, htmlStr);
tempvar := getTextDelimited(sep1, cEndCountry, htmlStr); //fs2012-04-06
//fs2012-04-06 tempvar := getTextDelimited('>', '<',tempvar);
HTMLRemoveTags(tempvar); //fs 2012-04-06
HTMLDecode(tempvar); //fs 2012-04-06
SetField(fieldCountry, tempvar);
tempvar:= getTextDelimited(cStartListItem, cEndListItem, htmlStr);
HTMLRemoveTags(tempvar); //fs 2012-04-03
HTMLDecode(tempvar); //fs 2012-04-03
SetField(fieldCategory, tempvar); //fs 2012-04-03
//fs 2012-04-03 SetField(fieldCategory, getTextDelimited(cStartCategory,cEndCategory,tempvar));
temp := Textbetween(htmlStr, 'durata ', apice);
SetField(fieldLength, temp);
//Get Director
temp:= TextBetween(htmlstr, cStartDirector,cEndDirectors);
HTMLRemoveTags(temp);
HTMLDecode(temp);
setfield(FieldDirector, Temp);
//Get Actors
temp:= getTextDelimited(cStartCast,cEndCast ,htmlStr);
//fs 2012-04-03 SetField(fieldActors, getCSVField(cStartActor,cEndActor,temp));
HTMLRemoveTags(temp); //fs 2012-04-03
HTMLDecode(temp); //fs 2012-04-03
SetField(fieldActors, trim(temp)); //fs 2012-04-03
if length(anno) < 1 then
SetField(fieldYear, getTextDelimited('>', '<',tempvar));
//Get comments
SaveHtmlstr:= htmlstr;
temp:= getTextDelimited(cStartDesc,cEndDesc ,htmlStr);
SetField(fieldDescription, temp);
temp := getTextDelimited(cStartComm,cEndComm ,htmlStr) + cEndComm;
temp := getTextDelimited('Voto al film: ', cEndComm, temp); //fs 2013-02-11
HTMLRemoveTags(temp); //fs 2012-04-03
HTMLDecode(temp); //fs 2012-04-03
SetField(fieldComments, trim(temp));
htmlstr:= SaveHtmlstr;
//Get URL
temp:= URLBase + getTextDelimited(cStartURL, cEndURL, htmlStr);
SetField(fieldURL, temp);
//Get image
imageLink:= getTextDelimited(cStartImgLink_ext, cEndImgLink_ext, htmlStr);
imagelink := getTextDelimited(cStartImgLink_int,cEndImgLink_int, imagelink);
if imagelink <> 'http://www.film.tv.it/imgbank/DUMMY/no_locandina.jpg' then
GetPicture(imageLink);
end;
//###############################################
//Returns a CSV list from an input string strIn where list items are
//separated by delIn and delOut strings
//##############################################
function getCSVField (delIn:string; delOut: string; Var strIn: string): string;
var
tempOut: string;
begin
result:='';
repeat
tempOut:=getTextDelimited(delIn, delOut,strIn);
if tempOut<>'' then
result:=result + tempOut + cStartListItem;
until tempOut='';
if length(result)>0 then result:=copy(result,1,1+length(result)-3);
end;
//###############################################
//##############################################
//Returns a text field from an input string strIn
//delIn and delOut: text field delimiters
//##############################################
function getTextDelimited(lIn:string; lOut:string;Var strIn:string): string;
var
StartPos: integer;
len:integer;
tempStr: string;
begin
StartPos := pos(lIn, strIn);
if startPos<>0 then
begin
StartPos:=StartPos+Length(lIn);
tempStr:= copy(strIn,StartPos,StartPos+length(strIn));
len := pos(lOut, tempStr);
if len=0 then
result:=''
else
result := copy(strIn, StartPos, len-1); // get Text Out
Delete(strIn, 1, StartPos-1 + len-1 + length(lOut)-2);
end
else
result := '';
HTMLDecode(result);
end;
// ------------------------------------------------------------------
// FILL PICKTREE CONTROL WITH LINKS & TITLES or RETURN ONE PAGE LINK
// if OneFilm flag true return Film Id else populate PickTree
// IN: OneFilm flag (bool)
// OUT: one page ID (string)
// ------------------------------------------------------------------
procedure PopulatePickTree();
var
filmUrl, partialUrl: string;
filmTitle, filmYear: string;
StartPos: integer;
EndPos: integer;
begin
PickTreeClear;
repeat
partialUrl:= getTextDelimited(cStartFilmUrl,cEndFilmUrl,PageStr);
filmUrl:=UrlBase + partialUrl;
filmTitle:=getTextDelimited(cStartTitle,cEndTitle,PageStr);
filmYear:=getTextDelimited(InitYear, EndYear,PageStr);
filmTitle := filmtitle + ' ' + filmYear;
MoviesFound := MoviesFound + 1;
if partialUrl<>'' then
begin
PickTreeAdd(filmTitle, filmUrl);
end;
until(partialUrl='');
end;
// ---------------------------------
// ANALYZE FIRST SEARCH RESULT PAGE:
// IN: html of search page (string)
// OUT: movie url
// ---------------------------------
function getMovieUrl(htmlSearchPage: string): string;
var
FilmId: string;
begin
result:='';
if pos('Non ho trovato nulla!', htmlSearchPage) > 0 then
ShowMessage('Title not found / Nessun film trovato.')
else
begin
PopulatePickTree();
if MoviesFound > 1 then
begin
if not PickTreeExec(result) then
begin
MoviesFound := 0;
exit;
end
end;
if MoviesFound <= 1 then
// begin
// if not PickTreeExec(result) then
exit; //Select one title
// end;
end;
end;
// ----------
// MAIN:
// IN: none
// OUT: none
// ----------
begin
if CheckVersion(3,5,1) then
begin
TranslatedStr := GetField(fieldTranslatedTitle);
OriginalStr := GetField(fieldOriginalTitle);
if (TranslatedStr <> '') then
MovieName := TranslatedStr
else
MovieName := OriginalStr;
if(Input('Film.TV.It', 'Enter the title of the movie / Inserire titolo del film:', MovieName)) then
begin
//Get search page
MoviesFound := 0;
searchUrl := QueryBase + UrlEncode(MovieName);
PageStr := RemoveExtraChars(searchUrl);
PageStr := UTF8Decode(PageStr);
//Analyze search page and get movie url (user choice)
MovieUrl:=getMovieUrl(PageStr);
// Get movie page
if MoviesFound = 0 then
exit;
PageStr := RemoveExtraChars(MovieUrl);
PageStr := UTF8Decode(PageStr);
Pagestr := Stringreplace(Pagestr, '’', '´');
//Analyze movie page and set movie fields
SetMovieFields(PageStr);
end;
end
else
ShowMessage('This script requires a newer version of Ant Movie Catalog (at least the version 3.5.1)');
end.