(* SCRIPT INFO: Following until 'SCRIPT BEGINS HERE...' is documentation. Please see 'USER OPTIONS' in the body of the script. --------------------------------------------- SCRIPT: Imdb Movie Photo(Poster) Script AUTHOR: Ivek23 VERSION: 0.1.5.0 DATE: 03/10/2016 --------------------------------------------- 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; //Credits types ctActors = 0; ctDirectors = 1; ctWriters = 2; ctComposers = 3; ctProducers = 4; //Script data SCRIPT_VERSION = '0.1.5.0'; SCRIPT_NAME = 'Imdb Movie Poster Script(2)'; SCRIPT_DESC = '[EN] Get Movie Poster from Imdb.com(2)'; SCRIPT_LANG = $09; //English SCRIPT_TYPE = stMovies; BASE_URL = 'http://www.imdb.com'; RATING_NAME = 'Imdb MoviePoster Script'; SEARCH_STR = 'http://www.imdb.com/find?s=tt&q=%s'; // SEARCH_STR = 'http://www.imdb.com/find?q=%s&s=tt'; // SEARCH_STR = 'http://www.imdb.com/find?q=%s&s=tt&exact=true'; // SEARCH_STR = 'http://www.imdb.com/find?q=%s&s=tt&ttype=ft'; // SEARCH_STR = 'http://www.imdb.com/find?q=%s&s=tt&ttype=tv'; // SEARCH_STR = 'http://www.imdb.com/find?q=%s&s=tt&ttype=ep'; CODE_PAGE = 65001; //Use 0 for Autodetect DEBUG = False; MAXIMUM_SIZE_X = 750; MAXIMUM_SIZE_Y = 600; SILENT_MODE = False; //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 [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 SelectImageSize : String; var X, Y, XY : String; begin; X := '_UX' + IntToStr(MAXIMUM_SIZE_X); Y := '_UY' + IntToStr(MAXIMUM_SIZE_Y); XY := '_CR' + IntToStr(MAXIMUM_SIZE_X); if ( MAXIMUM_SIZE_X > MAXIMUM_SIZE_Y ) then Result := X + Y else if ( MAXIMUM_SIZE_Y > MAXIMUM_SIZE_X ) then Result := Y + X else Result := XY; end; procedure ParseMovie(MovieURL : String; HTML : String); var curPos, endPos : Integer; //debug_pos1 : Integer; ImageSize : String; begin ImageSize := SelectImageSize(); //Get ~mfURL~ or ~IMDb Url~ endPos := Pos('/ "> 0 then begin curPos := PrevPos('"canonical" href="', HTML, endPos); AddFieldValue(mfURL, Copy(HTML, curPos + 18, endPos - curPos - 28)); end else AddFieldValue(mfURL, MovieURL); (* http://ia.media-imdb.com/images/M/ *) //~Poster~ //'._V1_.jpg"'; curPos := PosFrom('', HTML, endPos); if curPos > 0 then begin endPos := curPos; curPos := PosFrom('src="https://images-na.ssl-images-amazon.com/images/M/', HTML, curPos); while (curPos > 0) AND (curPos < PosFrom('itemprop="image" />', HTML, endPos)) do begin curPos := curPos + Length('src="https://images-na.ssl-images-amazon.com/images/M/'); endPos := PosFrom('._V1_.jpg"', HTML, curPos)+5; ExtraLinks[smPoster] := 'https://images-na.ssl-images-amazon.com/images/M/'+Copy(HTML, curPos, EndPos - curPos) + '.jpg'; ExtraLinks[smPoster] := StringReplace (ExtraLinks[smPoster], 'https://images-na.ssl-images-amazon.com/images/M/', 'http://ia.media-imdb.com/images/M/', True, True, False); curPos := PosFrom('src="https://images-na.ssl-images-amazon.com/images/M/', HTML, curPos); end; end else curPos := endPos; //~Poster~ //'._V1_UX182_CR0,0,182,268_AL_.jpg"'; curPos := PosFrom('
', HTML, endPos); if curPos > 0 then begin endPos := curPos; curPos := PosFrom('src="https://images-na.ssl-images-amazon.com/images/M/', HTML, curPos); while (curPos > 0) AND (curPos < PosFrom('itemprop="image" />', HTML, endPos)) do begin curPos := curPos + Length('src="https://images-na.ssl-images-amazon.com/images/M/'); endPos := PosFrom('._V1_UX182', HTML, curPos)+7; ExtraLinks[smPoster] := 'https://images-na.ssl-images-amazon.com/images/M/'+Copy(HTML, curPos, EndPos - curPos) + ImageSize + '.jpg'; ExtraLinks[smPoster] := StringReplace (ExtraLinks[smPoster], 'https://images-na.ssl-images-amazon.com/images/M/', 'http://ia.media-imdb.com/images/M/', True, True, False); curPos := PosFrom('src="https://images-na.ssl-images-amazon.com/images/M/', HTML, curPos); end; end else curPos := endPos; //~Poster~ //'._V1_UY268_CR3,0,182,268_AL_.jpg"'; curPos := PosFrom('
', HTML, endPos); if curPos > 0 then begin endPos := curPos; curPos := PosFrom('src="https://images-na.ssl-images-amazon.com/images/M/', HTML, curPos); while (curPos > 0) AND (curPos < PosFrom('itemprop="image" />', HTML, endPos)) do begin curPos := curPos + Length('src="https://images-na.ssl-images-amazon.com/images/M/'); endPos := PosFrom('._V1_UY268', HTML, curPos)+7; ExtraLinks[smPoster] := 'https://images-na.ssl-images-amazon.com/images/M/'+Copy(HTML, curPos, EndPos - curPos) + ImageSize + '.jpg'; ExtraLinks[smPoster] := StringReplace (ExtraLinks[smPoster], 'https://images-na.ssl-images-amazon.com/images/M/', 'http://ia.media-imdb.com/images/M/', True, True, False); curPos := PosFrom('src="https://images-na.ssl-images-amazon.com/images/M/', HTML, curPos); end; end else curPos := endPos; //~Poster~ //'._V1._CR13.883331298828125,29.533340454101562,308,445_UY268_CR1'; curPos := PosFrom('
', HTML, endPos); if curPos > 0 then begin endPos := curPos; curPos := PosFrom('src="https://images-na.ssl-images-amazon.com/images/M/', HTML, curPos); while (curPos > 0) AND (curPos < PosFrom('itemprop="image" />', HTML, endPos)) do begin curPos := curPos + Length('src="https://images-na.ssl-images-amazon.com/images/M/'); endPos := PosFrom('._V1._CR', HTML, curPos)+5; ExtraLinks[smPoster] := 'https://images-na.ssl-images-amazon.com/images/M/'+Copy(HTML, curPos, EndPos - curPos) + ImageSize + '.jpg'; ExtraLinks[smPoster] := StringReplace (ExtraLinks[smPoster], 'https://images-na.ssl-images-amazon.com/images/M/', 'http://ia.media-imdb.com/images/M/', True, True, False); curPos := PosFrom('src="https://images-na.ssl-images-amazon.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('', HTML); if curPos < 1 then Exit; LogMessage('Parsing search results...'); curPos := PosFrom(' 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('', HTML, curPos); Title := RemoveTags(Trim(Copy(HTML, curPos, endPos - curPos)), false); 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 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.