(*
SCRIPT INFO:
Following until 'SCRIPT BEGINS HERE...' is documentation.
Please see 'USER OPTIONS' in the body of the script.
---------------------------------------------
SCRIPT: Imdb Movie Script
AUTHOR: Ivek23
VERSION: 0.1.0.7
DATE: 06/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;
smCast = 2;
smReview = 3;
smCredits = 4;
smPoster = 5;
smFinished = 6;
//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;
//Credits types
ctActors = 0;
ctDirectors = 1;
ctWriters = 2;
ctComposers = 3;
ctProducers = 4;
//Script data
SCRIPT_VERSION = '0.1.0.7';
SCRIPT_NAME = 'Imdb Movie Script';
SCRIPT_DESC = '[EN] Get Movie Information about from Imdb.com';
SCRIPT_LANG = $09; //English
SCRIPT_TYPE = stMovies;
BASE_URL = 'http://www.imdb.com';
RATING_NAME = 'Imdb Movie Script';
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;
Mode : Byte;
ExtraLinks : array [smCast..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;
procedure ParseMovie(MovieURL : String; HTML : String);
var
curPos, endPos : Integer;
TmpStr : String;
begin
//Date ~Updated~ (choose simple or verbose version)
//AddCustomFieldValueByName('Updated', DateToStr(CurrentDateTime)); // Simple
// AddCustomFieldValueByName('IUpdated', DateToStr(CurrentDateTime)); // Simple
// AddCustomFieldValueByName('IUpdated', DateToStr(CurrentDateTime) + ' at ' + TimeToStr(CurrentDateTime)); // Verbose
//AddCustomFieldValueByName('IUpdated', DateToStr(CurrentDateTime) + ' at ' + TimeToStr(CurrentDateTime) + ' • ' + SCRIPT_NAME + ' ' + SCRIPT_VERSION); // Annoying
//Get ~mfURL~ or ~IMDb Url~
endPos := Pos('" /> 0 then begin
curPos := PrevPos('"canonical" href="', HTML, endPos);
AddFieldValue(mfURL, Copy(HTML, curPos + 18, endPos - curPos - 18));
end else
AddFieldValue(mfURL, MovieURL);
//~Rating~
curPos := PosFrom('', HTML, EndPos);
if curPos > 0 then begin
EndPos := curPos;
TmpStr := FloatToStr((StrToFloat(TextBetween(HTML, '', '', True, curPos)) * 1));
AddFieldValueXML('imdbrating', TmpStr);
end;
(*//~Votes~
curPos := PosFrom('', HTML, EndPos);
if curPos > 0 then begin
EndPos := curPos;
TmpStr1 := FloatToStr((StrToFloat(TextBetween(HTML, '', ' ', True, curPos)) * 1));
TmpStr1 := StringReplace(TmpStr1, '.', '', true, false, true);
AddCustomFieldValueByName('IMDB Votes', TmpStr1);
end;*)
end;
procedure ParseSearchResults(HTML : String);
var
curPos, endPos : Integer;
Title, URL, Preview : String;
begin
curPos := Pos('', HTML);
if curPos < 1 then
Exit;
LogMessage('Parsing search results...');
curPos := PosFrom(' 0 do begin
endPos := PosFrom('?ref_=fn', HTML, curPos);
URL := Trim(Copy(HTML, curPos+9, endPos - curPos-9));
URL := BASE_URL + URL;
curPos := PosFrom('>', HTML, curPos)+1;
endPos := PosFrom(' ', HTML, curPos);
Title := RemoveTags(Trim(Copy(HTML, curPos, endPos - curPos)), false);
// Title := StringReplace(Title, '-', #13, true, false, true);
Title := StringReplace(Title, ') -', ') '+#13, true, false, true);
curPos := PosFrom(' '' 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 (Mode = 0) AND (Pos('IMDb - ', HTML) > 0) then begin
ParseMovie(URL, HTML)
end else
if (Mode = 0) AND (Pos(' - IMDb', HTML) > 0) then begin
ParseMovie(URL, HTML)
end else
if Pos('IMDb - ', HTML) > 0 then
ParseMovie(URL, HTML)
else
if Pos(' - IMDb', 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.