For unregistered users:
Rottentomatoes (a1) script
v 0.1.0.5.a
Rottentomatoes (a1).psf
(*
SCRIPT INFO:
Following until 'SCRIPT BEGINS HERE...' is documentation.
Please see 'USER OPTIONS' in the body of the script.
---------------------------------------------
SCRIPT: Rottentomatoes (a1) Script
AUTHOR: Ivek23
VERSION: 0.1.0.5.a1
DATE: 04/03/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;
smDVDReleases = 5;
smBiography = 6;
smGenreindex = 7;
smAwards = 8;
smMiscellaneous = 9;
smPoster = 10;
smFinished = 11;
//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.0.5.a1';
SCRIPT_NAME = 'Rottentomatoes(a1) Script';
SCRIPT_DESC = '[EN] Get Movie Information(a1) from Rottentomatoes.com';
SCRIPT_LANG = $09; //English
SCRIPT_TYPE = stMovies;
BASE_URL = 'http://www.rottentomatoes.com';
RATING_NAME = 'Rottentomatoes';
SEARCH_STR = 'http://www.rottentomatoes.com/search/?search=%s&sitesearch=rt';
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
GET_RATING = True; //Set to False to ensure ~mfRating~ not set even if 'Overwrite setting' fields setting allows
//Global variables
var
ELI : Integer;
fullinfo, fullinfo1, fullinfo2 : String;
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;
Date, Title, URL, Month, TmpStr, TmpStr0, TmpStr1, TmpStr2, TmpStr3, TmpStr4, TmpStr5, TmpStr6: String;
DateParts : TWideArray;
begin
//Date ~Updated~ (choose simple or verbose version)
Date := DateToStr(CurrentDateTime);
if Date <> '' then
begin
ExplodeString(Date, DateParts, '-');
Date := DateParts[2] +'.'+ DateParts[1] +'.'+ DateParts[0];
AddCustomFieldValueByName('RTUpdated', Date + ' at ' + TimeToStr(CurrentDateTime) + ' • ' + SCRIPT_NAME + ' ' + SCRIPT_VERSION); // Annoying
end else
LogMessage('date not found');
//Get ~mfURL~ or ~RT Url~
endPos := Pos('" itemprop="url"/>', HTML);
if endPos > 0 then begin
curPos := PrevPos('"canonical" href="', HTML, endPos);
AddFieldValue(mfURL, Copy(HTML, curPos + 18, endPos - curPos - 18));
end else
AddFieldValue(mfURL, MovieURL);
//~Rating~ or ~RT Rating~
//curPos := PosFrom('<p class="critic_stats">', HTML, EndPos);
//if curPos > 0 then begin
// EndPos := curPos;
// TmpStr := TextBetween(HTML, 'Average Rating: <span>', '/10</span>', True, curPos);
// //TmpStr := StringReplace(TmpStr, ',', '', True, True, False);
// if TmpStr = '0' then
// TmpStr := '';
// AddCustomFieldValueByName('RT Rating', TmpStr);
//if TmpStr = '' then
// TmpStr := 'rating unknown';
//end;
//~Rating~
//If Pos('audience', HTML) > 0 then begin
//If Pos('<span class="meter popcorn numeric ">', HTML) > 0 then begin
curPos := PosFrom('<span class="meter popcorn numeric ">', HTML, EndPos);
if curPos > 0 then begin
EndPos := curPos;
curPos := PosFrom('<p class="critic_stats">', HTML, EndPos);
if curPos > 0 then begin
curPos := PosFrom('Average Rating: ', HTML, curPos);
endPos := PosFrom('/5', HTML, curPos);
TmpStr3 := StringReplace(FloatToStr((StrToFloat(Copy(HTML, curPos + 16, endPos - curPos - 16)) * 2)), '/5', '', True, True, False);
if TmpStr3 = '0' then
TmpStr3 := '';
if GET_RATING then
AddFieldValue(mfRating, TmpStr3);
AddCustomFieldValueByName('RT Rating', TmpStr3);
if TmpStr3 = '' then
TmpStr3 := 'rating unknown';
// end;
end;
end else
//~Rating~
//If Pos('audience', HTML) > 0 then begin
//If Pos('<span class="meter spilled numeric ">', HTML) > 0 then begin
curPos := PosFrom('<span class="meter spilled numeric ">', HTML, EndPos);
if curPos > 0 then begin
EndPos := curPos;
curPos := PosFrom('<p class="critic_stats">', HTML, EndPos);
if curPos > 0 then begin
curPos := PosFrom('Average Rating: ', HTML, curPos);
endPos := PosFrom('/5', HTML, curPos);
TmpStr4 := StringReplace(FloatToStr((StrToFloat(Copy(HTML, curPos + 16, endPos - curPos - 16)) * 2)), '/5', '', True, True, False);
if TmpStr4 = '0' then
TmpStr4 := '';
if GET_RATING then
AddFieldValue(mfRating, TmpStr4);
AddCustomFieldValueByName('RT Rating', TmpStr4);
if TmpStr4 = '' then
TmpStr4 := 'rating unknown';
// end;
end;
end;
end;
procedure ParseSearchResults(HTML : String);
var
curPos, endPos : Integer;
Title, Year, URL, Preview : String;
begin
curPos := Pos('<ul id="movie_results_ul" class="results_ul" ', HTML);
if curPos < 1 then
Exit;
LogMessage('Parsing search results...');
EndPos := PosFrom('<span class="movieposter">', HTML, EndPos);
curPos := PosFrom('<img src="', HTML, EndPos);
endPos := PosFrom('" width="', HTML, curPos);
Preview := Copy(HTML, curPos+10, EndPos - curPos-10);
curPos := PosFrom('<a target="_top" href="/m/', HTML, curPos);
while (curPos > 0) AND (curPos < PosFrom('<a id="more_movies" href="#results_movies_tab">More Movies...</a>', HTML, endPos)) do begin
endPos := PosFrom('" class=', HTML, curPos);
URL := 'http://www.rottentomatoes.com/'+Trim(Copy(HTML, curPos+23, endPos - curPos-23));
curPos := PosFrom('" class="" >', HTML, curPos);
endPos := PosFrom('</a>', HTML, curPos);
Title := TextBetween(HTML, '" class="" >', '</a>', True, curPos);
curPos := PosFrom('<span class="movie_year">', HTML, curPos);
endPos := PosFrom('</span></h3>', HTML, curPos);
Year := RemoveTags(TextBetween(HTML, '<span class="movie_year">', '</span></h3>', True, curPos), false);
AddSearchResult(Title+' '+Year, '', '', URL, Preview);
EndPos := PosFrom('<span class="movieposter">', HTML, EndPos);
curPos := PosFrom('<img src="', HTML, EndPos);
endPos := PosFrom('" width="', HTML, curPos);
Preview := Copy(HTML, curPos+10, EndPos - curPos-10);
curPos := PosFrom('<a target="_top" href="/m/', 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://rottentomatoes.com', 'http://www.rottentomatoes.com', True, True, False);
if Pos('Search Results - Rotten Tomatoes', HTML) > 0 then begin
ParseSearchResults(HTML);
Result := prList;
Exit;
end else
if Pos(' - Rotten Tomatoes</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.