(*	
SCRIPT INFO:

Following until 'SCRIPT BEGINS HERE...' is documentation.
	Please see 'USER OPTIONS' in the body of the script.

---------------------------------------------

SCRIPT:		Imdb Movie Photo Script
AUTHOR:			Ivek23
VERSION:		0.1.2.0
DATE:			24/09/2014

---------------------------------------------

TYPES AND FUNCTIONS
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 AddAwardEx(Event, Award, Category, RecipientVal1, RecipientVal2, 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 AnsiString(S, OldPattern, NewPattern: String; All : 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 CurrentDateTime : Extended
	function DateToStr(Value : Extended) : String
	function TimeToStr(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)
*)

//SCRIPT BEGINS HERE...

//Some useful constants

const

//Script types
	stMovies		= 0;
	stPeople		= 1;
	stPoster		= 2;
	
///Script modes
	smSearch		= 0;
	smNormal		= 1;
	smBiography		= 2;
	smGenreindex	= 3;
	smAwards		= 4;
	smFilmography	= 5;
	smMiscellaneous	= 6;
	smPoster		= 7;
	smFinished		= 8;
	
//Parse results
	prError			= 0;
	prFinished		= 1;
	prList			= 2;
	prListImage		= 3;
	prDownload		= 4;
	
//Prefix modes
	pmNone			= 0;
	pmEnd			= 1;
	pmBegin			= 2;
	pmRemove		= 3;
	
//Download methods
	dmGET			= 0;
	dmPOST			= 1;
	
//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;  
	pfComment   	= 9;
	pfBookmark   	= 10;
	pfPid        	= 11; 
	pfCareer    	= 12; 
	
//Credits types
	ctActors		= 0;
	ctDirectors		= 1;
	ctWriters		= 2;
	ctComposers		= 3;
	ctProducers		= 4;
	
//Script data
	SCRIPT_VERSION	= '0.1.2.0';
	SCRIPT_NAME	= 'Imdb Movie Photo Script';
	SCRIPT_DESC	= '[EN] Get Movie Photo from Imdb.com';
	SCRIPT_LANG	= $09; //English
	SCRIPT_TYPE	= stMovies;
	
	BASE_URL	= 'http://www.imdb.com';
	RATING_NAME	= 'Imdb MoviePhoto Script';
//	SEARCH_STR	= 'http://www.imdb.com/find?q=%s&s=tt&exact=true';
	SEARCH_STR	= 'http://www.imdb.com/find?q=%s&s=tt';
//	SEARCH_STR	= 'http://www.imdb.com/find?s=tt&q=%s';
	CODE_PAGE	= 65001;	//Use 0 for Autodetect
	
//User Options
	GET_THEMES	= True;	//Set to False to ensure ~mfCategory~ not added even if 'Overwrite fields' setting allows
    GET_POSTER  = False; //Set to False or True

//Global variables
var
ELI : Integer;
fullinfo, fullinfo0, fullinfo00, fullinfo1, fullinfo2, fullinfo3 : String;
Mode : Byte;
ExtraLinks : array [smBiography..smPoster] of 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 (Mode = smSearch) then
		Result := SEARCH_STR
	else
		Result := ExtraLinks[Mode];
end;

function GetDownloadMethod : Byte;
begin
	Result := dmGET;
end;

function GetPrefixMode : Byte;
begin
	Result := pmBegin;
end;

function GetScriptType : Byte;
begin
	Result := SCRIPT_TYPE;
end;

function GetCurrentMode : Byte;
begin
	Result := Mode;
end;

function RemoveTagsEx(AText : String) : String;
var
	B, E : Integer;
begin
	Result	:= AText;
	B		:= PosFrom('<', Result, 1);
	E		:= PosFrom('>', Result, B);

	while (B > 0) AND (B < E) do begin
		Delete(Result, B, E - B + 1);
		B	:= Pos('<', Result);
		E	:= Pos('>', Result);
	end;
end;

procedure ParseMovie(MovieURL : String; HTML : String);
var
	curPos, endPos : Integer;
	URL, TmpStr : String;
begin

//Get ~mfURL~ or ~IMDb Url~
endPos := Pos('/ "><meta property="og:url"', HTML);
if endPos > 0 then begin
	curPos := PrevPos('"canonical" href="', HTML, endPos);
	AddFieldValue(mfURL, Copy(HTML, curPos + 18, endPos - curPos - 28));	
end else
	AddFieldValue(mfURL, MovieURL); 
		
//~Poster~	
curPos := PosFrom('<td rowspan="2" id="img_primary">', HTML, endPos);
if curPos > 0 then begin
	endPos := curPos;
	curPos := PosFrom('src="http://ia.media-imdb.com/images/M', HTML, curPos);
	while (curPos > 0) AND (curPos < PosFrom('<td id="overview-top">', HTML, endPos)) do begin
		curPos := curPos + Length('src="http://ia.media-imdb.com/images/M');
		endPos := PosFrom('"', HTML, curPos);	
		ExtraLinks[smPoster] := 'http://ia.media-imdb.com/images/M'+Copy(HTML, curPos, EndPos - curPos);	
		curPos := PosFrom('src="http://ia.media-imdb.com/images/M', HTML, curPos);
	end;
end else
curPos := endPos;

end;


procedure ParseSearchResults(HTML : String);
var
	curPos, endPos : Integer;
	Title, URL, Preview : String;
begin
	curPos := Pos('<table class="findList">', HTML);
	if curPos < 1 then
		Exit;

LogMessage('Parsing search results...');

	curPos  := PosFrom('<img src="', HTML, curPos) + 10;
	endPos  := PosFrom('</td> ', HTML, curPos);
	Preview := Trim(Copy(HTML, curPos, endPos - curPos));
	
curPos := PosFrom('<a href="/title/', HTML, curPos);
while curPos > 0 do begin
	endPos	:= PosFrom('?ref_=fn_tt_tt_', HTML, curPos);
	URL		:= Trim(Copy(HTML, curPos+9, endPos - curPos-9));
	URL		:= BASE_URL + URL;
	
	curPos	:= PosFrom('>', HTML, curPos)+1;
	endPos	:= PosFrom('</td> </tr>', HTML, curPos);
	Title	:= RemoveTags(Trim(Copy(HTML, curPos, endPos - curPos)), false); 

	curPos  := PosFrom('<img src="', HTML, curPos) + 10;
	endPos  := PosFrom('</td> ', HTML, curPos);
	Preview := Trim(Copy(HTML, curPos, endPos - curPos));
	
	AddSearchResult(Title, '', '', URL, '');
	
	curPos := PosFrom('<a href="/title/', HTML, curPos);
 end;
 
end;

function NextMode(curMode : Integer) : Integer;
var
	I : Integer;
begin
Result := smFinished;
if curMode < Low(ExtraLinks) - 1 then
	curMode := Low(ExtraLinks) - 1;

for I := curMode + 1 to High(ExtraLinks) do
	if ExtraLinks[I] <> '' then begin
		Result := I;
		Break;
	end;
end;

function ParsePage(HTML : String; URL : AnsiString) : Cardinal;
begin
HTML := HTMLToText(HTML);
HTML := StringReplace (HTML, 'http://imdb.com', 'http://www.imdb.com', True, True, False);

if Pos('Find - IMDb', HTML) > 0 then begin
	ParseSearchResults(HTML);
	Result := prList;
	Exit;
		
end else
 if Pos('<title>IMDb - ', HTML) > 0 then
    ParseMovie(URL, HTML)
else
 if Pos(' - IMDb</title>', HTML) > 0 then
    ParseMovie(URL, HTML);

Mode := NextMode(Mode);
if Mode <> smFinished then
	Result := prDownload
else
	Result := prFinished;
end;

begin
Mode := smSearch;
for ELI := Low(ExtraLinks) to High(ExtraLinks) do
	ExtraLinks[ELI] := '';
end.