Hello!
First sorry for my english (i'm french)!
I tried to make a script to download data from egafd.com, adapted to the iafd script.
Script :
//This version of script is for use with PVD versions 0.9.9.16 and above!!!
(*
Additional types and functions that can be used in scripts:
//Types
TWIDEARRAY : array of String
//Field functions
procedure AddSearchResult(Title1, Title2, Year, URL, PreviewURL : String)
procedure AddFieldValue(AField: Integer; AValue : String)
procedure AddMoviePerson(Name, TransName, Role, URL : String; AType : Byte)
procedure AddPersonMovie(Title, OrigTitle, Role, Year, URL : String; AType : Byte)
procedure AddAward(Event, Award, Category, Recipient, Year: String; const Won : Boolean)
procedure AddConnection(Title, OrigTitle, Category, URL, Year: String)
procedure AddEpisode(Title, OrigTitle, Description, URL, Year, Season, Episode : String)
//String functions
function Pos(Substr : String; Str: String): Integer
function PosFrom(const SubStr, Str : String; FromIndex : Integer) : Integer
function LastPos(const SubStr, Str : String) : Integer
function PrevPos(const SubStr, Str : String; APos : Integer) : Integer
function RemoveTags(AText : String; doLineBreaks : Boolean) : String
function ExplodeString(AText : String; var Items : TWideArray; Delimiters : String) : Integer
function Copy(S: String; Index, Count: Integer): String
procedure Delete(var S: String; Index, Count: Integer)
procedure Insert(Source: String; var Dest: String; Index: Integer)
function Length(S: String): Integer
function Trim(S: String): String
function CompareText(S1, S2: String): Integer
function CompareStr(S1, S2: String): Integer
function UpperCase(S: String): String
function LowerCase(S: String): String
function StringReplace(S, OldPattern, NewPattern: String; ReplaceAll : Boolean; IgnoreCase : Boolean; WholeWord: Boolean): String
function StrToInt(const S: String): Integer
function IntToStr(const Value: Integer): String
function StrToFloat(const S: String): Extended
function FloatToStr(const Value: Extended): String
function HTMLValues(const HTML : String; ABegin, AEnd, ItemBegin, ItemEnd : String; ValDelim : String; var Pos : Integer) : String
function HTMLValues2(const HTML : String; ABegin, AEnd, ItemBegin, ItemEnd : String; ValDelim : String; var Pos : Integer) : String
function TextBetween(const HTML : String; ABegin, AEnd : String; doLineBreaks : Boolean; var Pos : Integer) : String
function HTMLToText(const HTML : String) : String
procedure ShowMessage(const Msg, Head : String)
*)
const
pauseBeforeLoad = 1000; // Pause before loading (in millisecond)
//Some useful constants
const
//Script types
stMovies = 0;
stPeople = 1;
stPoster = 2;
//Script modes
smSearch = 0;
smNormal = 1;
smPoster = 2;
//Parse results
prError = 0;
prFinished = 1;
prList = 2;
prListImage = 3;
prDownload = 4;
//Movie fields
mfURL = 0;
mfTitle = 1;
mfOrigTitle = 2;
mfAka = 3;
mfYear = 4;
mfGenre = 5;
mfCategory = 6;
mfCountry = 7;
mfStudio = 8;
mfMPAA = 9;
mfRating = 10;
mfTags = 11;
mfTagline = 12;
mfDescription = 13;
mfDuration = 14;
mfFeatures = 15;
//People fields
pfURL = 0;
pfName = 1;
pfTransName = 2;
pfAltNames = 3;
pfBirthday = 4;
pfBirthplace = 5;
pfGenre = 6;
pfBio = 7;
pfDeathDate = 8;
//Credits types
ctActors = 0;
ctDirectors = 1;
ctWriters = 2;
ctComposers = 3;
ctProducers = 4;
//Script data
//This version of script is for use with PVD versions 0.9.9.16 and above!!!
SCRIPT_VERSION = '0.0.0.1';
SCRIPT_NAME = 'EGAFD.com';
SCRIPT_DESC = '[EN] Get movie information from EGAFD.com';
SCRIPT_LANG = $09; //English
SCRIPT_TYPE = stMovies;
BASE_URL = 'http://www.egafd.com';
RATING_NAME = 'ADE';
SEARCH_STR = 'www.egafd.com/results.asp?SearchType=Mozilla-search&SearchString=%s';
CODE_PAGE = 0; //Use 0 for Autodetect
//Global variables
var
Mode : Byte;
PosterURL : String;
//Functions
function GetScriptVersion : String;
begin
Result := SCRIPT_VERSION;
end;
function GetScriptName : String;
begin
Result := SCRIPT_NAME;
end;
function GetScriptDesc : String;
begin
Result := SCRIPT_DESC;
end;
function GetRatingName : String;
begin
Result := RATING_NAME;
end;
function GetScriptLang: Cardinal;
begin
Result := SCRIPT_LANG;
end;
function GetCodePage : Cardinal;
begin
Result := CODE_PAGE;
end;
function GetBaseURL : AnsiString;
begin
Result := BASE_URL;
end;
function GetDownloadURL : AnsiString;
begin
if PosterURL = '' then
Result := SEARCH_STR
else
Result := PosterURL;
end;
function GetScriptType : Byte;
begin
Result := SCRIPT_TYPE;
end;
function GetCurrentMode : Byte;
begin
Result := Mode;
end;
procedure FindPoster(HTML : String);
var
curPos, EndPos : Integer;
begin
LogMessage('procedure Findposter en cours')
// curPos := Pos('<span class="Item_ViewTitle">Box Cover</span>', HTML);
// curPos := PosFrom('<img src="', HTML, curPos);
// curPos := curPos + Length('<img src="');
// EndPos := PosFrom('"', HTML, curPos);
// PosterURL := Copy(HTML, curPos, EndPos - curPos);
end;
// ParseMovie
// - after searchlist selection this function is called with the new html content
procedure ParseMovie(MovieURL : String; HTML : String);
var
curPos, EndPos, P, P2, L: Integer;
actPosStart,actPosStart2,
actPosEnd, UrlPosStart,UrlPosEnd,debug_pos1:Integer;
Tmp, URL, Name,dbgstrg,tmpstrg : String;
ActorNames: TWideArray;
ActorNumber,I,J: Integer;
begin
AddFieldValue(mfURL, MovieURL);
LogMessage('Page parsing started');
EndPos := 1;
//Check for title. No orig. title info present, so duplicate..
dbgstrg:= TextBetween(HTML, '<title>', '</title>', False, EndPos);
LogMessage('Title: ' + dbgstrg);
AddFieldValue(mfOrigTitle,dbgstrg);
AddFieldValue(mfTitle,dbgstrg);
//Year
dbgstrg := '';
CurPos := Pos('Released: ', HTML);
endpos := CurPos;
LogMessage('getting year');
dbgstrg := TextBetween(HTML, '">', '</td>', False, CurPos);
LogMessage('YEAR:' + dbgstrg);
AddFieldValue(mfYear,dbgstrg);
//Director
curPos := Pos('Director: ', HTML);
EndPos := curPos;
LogMessage('getting Director');
dbgstrg:= TextBetween(HTML, '">', '</td>', False, CurPos);
LogMessage('DIRECTOR:' + dbgstrg);
AddMoviePerson(dbgstrg, '', '', '', ctDirectors);
//Notes
curpos := Pos('Notes: ' , HTML);
EndPos := curPos;
LogMessage('Notes')
dbgstrg := TextBetween(HTML, '">', '</td>', False, CurPos);
LogMessage('Notes :' + dbgstrg);
AddFieldValue(mfDescription, dbgstrg);
//AKA - Titles...
LogMessage('getting all titles')
Curpos := Pos('<th>Alternate Titles</th>' ,HTML);
EndPos := curPos;
while (curPos > 0) AND (curPos < PosFrom('<th>Actresses</th>', HTML, EndPos)) do begin
EndPos := curPos;
actPosStart := PosFrom('class="flma"', HTML, EndPos);
actPosEnd := PosFrom('</span>', HTML, actPosStart);
dbgstrg := Trim(Copy(HTML, (actPosstart + 13), (actPosEnd - actPosStart - 13) ));
LogMessage('AKA: ' + dbgstrg);
AddFieldValue(mfAka, dbgstrg);
curpos := PosFrom('class="flma"', HTML, actPosEnd);
end;
//Cast
curPos:= Pos('<th>Actresses</th>', HTML);
LogMessage('Cast readout');
if curPos > 0 then begin
EndPos := curPos;
while (curPos > 0) AND (curPos < PosFrom('<th>Notes</th>', HTML, EndPos)) do begin
EndPos := curPos; // Set last position to actual position
// get url
UrlPosStart := PosFrom('href="', HTML, EndPos); // search for url start
UrlPosEnd := PosFrom('>', HTML, UrlPosStart); // search for url end
URL := BASE_URL + Trim(Copy(HTML, UrlPosStart + 6, (UrlPosEnd - UrlPosStart - 7) ));
LogMessage(URL);
// Get Name
actPosStart := PosFrom('href="', HTML, EndPos); // search for url start;
actPosStart2 := PosFrom('">', HTML, actPosStart)
actPosEnd:=PosFrom('</a>', HTML, actPosStart2); // search for url end
Name := Trim(Copy(HTML, (actPosStart2 + 2), (actPosEnd - actPosStart2 - 2) ));
LogMessage(Name);
debug_pos1:=Pos('(',Name);
if debug_pos1 >0 then
Name := Copy(Name,0,debug_pos1-1);
LogMessage(Name);
AddMoviePerson(Trim(Name), '', '', LowerCase(URL), ctActors);
curPos := PosFrom('href="', HTML, actPosEnd);
end;
end;
end; // End of the routine...
// ParseSearchResults
// - create list of movies found during the search
procedure ParseSearchResults(HTML : String);
var
curPos, EndPos, P : Integer;
Title, Year, URL, Studio : String;
begin
LogMessage('procedure ParseSearchResults en cours')
EndPos := 1;
LogMessage('Parsing movie list...');
curPos := PosFrom('<dt>', HTML, EndPos);
while curPos > 0 do
begin
// Each movie entry starts with <dt>
EndPos := curPos + Length('<dt>');
curPos := PosFrom('<a href="', HTML, EndPos);
if curPos > 0 then begin
curPos := curPos + Length('<a href="');
EndPos := PosFrom('"', HTML, curPos);
URL := BASE_URL + '/' + Copy(HTML, curPos, EndPos - curPos);
LogMessage('URL detected: '+URL);
end;
Title := TextBetween(HTML, '>', '</a>', False, EndPos);
LogMessage(Title);
// Now that we got the title, move on to the studio...
curPos := PosFrom('<b>Release Info:</b>', HTML, EndPos);
if curPos > 0 then begin
curPos := curPos + Length('<b>Release Info:</b>') + 1;
EndPos := PosFrom(',', HTML, curPos);
Studio := Copy(HTML, curPos, EndPos - curPos);
LogMessage(Studio);
curPos := EndPos + 2;
EndPos := PosFrom('<', HTML, curPos);
Year := Copy(HTML, curPos, EndPos - curPos);
LogMessage(Year);
end;
AddSearchResult(Title, Studio, Year, URL, '');
curPos := PosFrom('<dt>', HTML, EndPos);
end;
end;
// ParsePage
// - Entrypoint for the script. Check if the search-term leads to zero, one or many results.
function ParsePage(HTML : String; URL : AnsiString) : Cardinal;
begin
Wait (pauseBeforeLoad);
LogMessage('Script version:' + SCRIPT_VERSION);
Mode := smNormal;
ParseMovie(URL, HTML);
Result := prFinished; //script has finished it's job
{Result := prError; //error (unknown page retrieved)}
end;
begin
Mode := smSearch;
end.
For use this script, the URL of the page must be indicate in the data movie before execute.
The data transfered are good in my PC!
My problem is to write "notes" in field comment and not in field description!
I tried to declare "mfComment = 16;" but no data are transfered!
If somebody is interested, or can improve it!
Thanks a lot!