{ Global variables } var sMode : Byte; sPosterURL : string; sPosterJPG : string; { Constants } const { Pause before loading (in ms) } K_PAUSE_BEFORE_LOADING = 0; { Script types } K_TYPE_MOVIE = 0; K_TYPE_PEOPLE = 1; K_TYPE_POSTER = 2; { Script modes } K_MODE_SEARCH = 0; K_MODE_NORMAL = 1; K_MODE_POSTER = 2; { Parse results } K_PARSE_ERROR = 0; K_PARSE_FINISHED = 1; K_PARSE_LIST = 2; K_PARSE_LIST_IMAGE = 3; K_PARSE_DOWNLOAD = 4; { Movie fields } K_MOVIE_URL = 0; K_MOVIE_TITLE = 1; K_MOVIE_ORIGTITLE = 2; K_MOVIE_AKA = 3; K_MOVIE_YEAR = 4; K_MOVIE_GENRE = 5; K_MOVIE_CATEGORY = 6; K_MOVIE_COUNTRY = 7; K_MOVIE_STUDIO = 8; K_MOVIE_MPAA = 9; K_MOVIE_RATING = 10; K_MOVIE_TAGS = 11; K_MOVIE_TAGLINE = 12; K_MOVIE_DESCRIPTION = 13; K_MOVIE_DURATION = 14; K_MOVIE_FEATURES = 15; { Persons } K_PERSON_ACTORS = 0; K_PERSON_DIRECTORS = 1; K_PERSON_WRITERS = 2; K_PERSON_COMPOSERS = 3; K_PERSON_PRODUCERS = 4; { Script information } K_SCRIPT_AUTHOR = 'Isolki'; K_SCRIPT_VERSION = '0.4.0.0'; K_SCRIPT_NAME = 'cduniverse.com'; K_SCRIPT_DESC = 'CDUniverse.com'; K_BASE_URL = 'http://www.cduniverse.com'; K_SCRIPT_LANG = $09; // $09: English K_CODE_PAGE = 0; // 0: Autodetect K_SCRIPT_TYPE = K_TYPE_MOVIE; // "%s" corresponds to the title K_SEARCH_URL = 'http://www.cduniverse.com/sresult.asp?HT_Search=TITLE&HT_Search_Info=%s&style=movie'; { To identify pages } K_SEARCH_NOTITLE_TRAIT = 'No Title Matches Found'; K_SEARCH_NOIMAGE_TRAIT = 'That Product Image Is Not Found'; K_SEARCH_RESULTS_TRAIT = 'Search Harder for More Matches'; K_SEARCH_PRODUCT_TRAIT = 'Product Description'; K_SEARCH_POSTERS_TRAIT = 'View Product Information'; { To parse results page } K_RESULTS_MAX_NUMBER = 1000; // Security (The scripts only takes the first 25 results) K_RESULTS_PRODUCT_TRT = ' 0) then begin lMovieURL := K_BASE_URL + TextBetween(lText, K_RESULTS_MOVIE_URL_BGN, K_RESULTS_MOVIE_URL_END, False, lHrefPosition); lTitle := TextBetween(lText, K_RESULTS_TITLE_BGN, K_RESULTS_TITLE_END, False, lHrefPosition); LogMessage('lTitle : ' + lTitle + ', lMovieURL : ' + lMovieURL); AddSearchResult(lTitle, '', '', lMovieURL, ''); end; until (( PosFrom(K_RESULTS_PRODUCT_TRT, lHTML, lPosition) <= 0 ) or (lResultNumber > K_RESULTS_MAX_NUMBER)) LogMessage('--- ParseSearchResults End ---'); end; procedure ParseMovie(MovieURL : string; HTML : string); var i, lPosition, lPosBgn, lPosEnd : Integer; lMinutes : double; lComments, lText, lURL : string; lMovieTrait, lNames : array of string; begin LogMessage('--- ParseMovie Bgn ---'); { Poster URL } lPosition := 1; lPosBgn := PosFrom(K_MOVIE_POSTER_BGN, HTML, lPosition); lPosEnd := PosFrom(K_MOVIE_POSTER_END, HTML, lPosBgn); lText := Copy(HTML, lPosBgn, lPosEnd - lPosBgn); lPosition := 1; lURL := TextBetween(lText, K_MOVIE_POSTER_URL_BGN, K_MOVIE_POSTER_URL_END, False, lPosition); if (lURL <> '') then sPosterURL := K_BASE_URL + lURL else begin { If the poster URL is not found, load the preview image } lPosition := Pos(K_MOVIE_POSTER_TRT, HTML); lPosBgn := PosFrom('http', HTML, lPosition); lPosEnd := PosFrom('.jpg', HTML, lPosBgn) + Length('.jpg'); if ((lPosBgn <> 0) and (lPosEnd <> 0)) then sPosterURL := Copy(HTML, lPosBgn, lPosEnd - lPosBgn) else ShowMessage('Movie Poster Not Found', 'Movie Page'); end; LogMessage('sPosterURL : ' + sPosterURL); { Movie URL } AddFieldValue(K_MOVIE_URL, MovieURL); { Movie Original Title } lPosition := 1; lText := TextBetween(HTML, K_MOVIE_TITLE_BGN, K_MOVIE_TITLE_END, False, lPosition); AddFieldValue(K_MOVIE_ORIGTITLE, lText); LogMessage('+ Movie original title : ' + lText); { Movie Orig Year, Category and Studio } ExplodeString(K_MOVIE_TRAITS, lMovieTrait, ','); for i := Low(lMovieTrait) to High(lMovieTrait) do begin if (lMovieTrait[i] <> '0') then begin lPosition := Pos(lMovieTrait[i], HTML); lText := TextBetween(HTML, K_MOVIE_TD_BGN, K_MOVIE_TD_END, False, lPosition); LogMessage('+ Field ' + lMovieTrait[i] + ' : ' + lText); AddFieldValue(i, lText); end end; { Movie Description } lPosition := Pos(K_MOVIE_DESC_TRT, HTML); lText := TextBetween(HTML, K_MOVIE_DESC_BGN, K_MOVIE_DESC_END, True, lPosition); AddFieldValue(K_MOVIE_DESCRIPTION, lText); LogMessage('+ Movie description : ' + lText); { Movie Release Date } lPosition := Pos(K_MOVIE_RELEASE_DATE_TRT, HTML); lText := TextBetween(HTML, K_MOVIE_TD_BGN, K_MOVIE_TD_END, False, lPosition); AddFieldValueXML('release', lText); LogMessage('+ Release date : ' + lText); { Movie Actors } lPosition := Pos(K_MOVIE_ACTORS_TRT, HTML); lText := HTMLValues2(HTML, K_MOVIE_ACTORS_BGN, K_MOVIE_ACTORS_END, K_MOVIE_ACTOR_BGN, K_MOVIE_ACTOR_END, ',', lPosition); LogMessage('+ Actors : ' + lText); ExplodeString(lText, lNames, ','); for i := Low(lNames) to High(lNames) do AddMoviePerson(lNames[i], '', '', '', K_PERSON_ACTORS); { Movie MPAA } lPosition := Pos(K_MOVIE_MPAA_TRT, HTML); lText := TextBetween(HTML, K_MOVIE_MPAA_BGN, K_MOVIE_MPAA_END, False, lPosition); AddFieldValueXML('mpaa', lText); LogMessage('+ Movie MPAA : ' + lText); { Movie DVD features } lPosition := Pos(K_MOVIE_DVD_FEAT_TRT, HTML); lPosBgn := PosFrom(K_MOVIE_DVD_FEAT_BGN, HTML, lPosition); lPosEnd := PosFrom(K_MOVIE_DVD_FEAT_END, HTML, lPosBgn); lText := Trim(Copy(HTML, lPosBgn + Length(K_MOVIE_DVD_FEAT_BGN), lPosEnd - lPosBgn - Length(K_MOVIE_DVD_FEAT_BGN))); AddFieldValue(K_MOVIE_FEATURES, lText); LogMessage('+ Movie DVD features : ' + lText); { Movie running time } lPosition := Pos(K_MOVIE_RUNTIME_TRT, HTML); lText := TextBetween(HTML, K_MOVIE_RUNTIME_BGN, K_MOVIE_RUNTIME_END, False, lPosition); lMinutes := StrToFloat(lText); lText := FloatToStr(lMinutes * 60); AddFieldValueXML('length', lText); LogMessage('+ Running time : ' + lText); { Movie comments } lPosition := Pos(K_MOVIE_NB_OF_DISCS_TRT, HTML); lText := TextBetween(HTML, K_MOVIE_NB_OF_DISCS_BGN, K_MOVIE_NB_OF_DISCS_END, False, lPosition); lComments := 'Discs: ' + lText + #13#10; lPosition := Pos(K_MOVIE_DETAILS_TRT, HTML); lText := TextBetween(HTML, K_MOVIE_DETAILS_BGN, K_MOVIE_DETAILS_END, False, lPosition); lComments := lComments + 'Movie Details: ' + lText + #13#10; AddFieldValueXML('comment', lComments); //AddFieldValue(K_MOVIE_TITLE); //AddFieldValue(K_MOVIE_AKA); //AddFieldValue(K_MOVIE_GENRE); //AddFieldValue(K_MOVIE_COUNTRY); //AddFieldValue(K_MOVIE_MPAA); //AddFieldValue(K_MOVIE_TAGS); //AddFieldValue(K_MOVIE_TAGLINE); //AddFieldValue(K_MOVIE_FEATURES); LogMessage('--- ParseMovie End ---'); end; procedure ParsePoster(HTML : string); var lPosition : Integer; begin lPosition := Pos(K_POSTER_JPG_TRT, HTML); sPosterJPG := TextBetween(HTML, K_POSTER_JPG_BGN, K_POSTER_JPG_END, False, lPosition); LogMessage('sPosterJPG : ' + sPosterJPG); end; { Obligatory callback functions } function GetScriptVersion : string; begin Result := K_SCRIPT_VERSION; end; function GetScriptName : string; begin Result := K_SCRIPT_NAME; end; function GetScriptDesc : string; begin Result := K_SCRIPT_DESC; end; function GetBaseURL : AnsiString; begin Result := K_BASE_URL; end; function GetScriptLang : Cardinal; begin Result := K_SCRIPT_LANG; end; function GetCodePage : Cardinal; begin Result := K_CODE_PAGE; end; function GetScriptType : Byte; begin Result := K_SCRIPT_TYPE; end; function GetCurrentMode : Byte; begin Result := sMode; end; { This function allows to choose what will be downloaded } function GetDownloadURL : AnsiString; begin LogMessage('--- GetDownloadURL ---'); if (sMode = K_MODE_SEARCH) then begin LogMessage('K_MODE_SEARCH'); Result := K_SEARCH_URL // Load search results LogMessage('K_SEARCH_URL : ' + K_SEARCH_URL); end else if (sMode = K_MODE_NORMAL) then begin LogMessage('K_MODE_NORMAL'); Result := sPosterURL // Load poster URL end else if (sMode = K_MODE_POSTER) then begin LogMessage('K_MODE_POSTER'); Result := sPosterJPG; // Load poster JPG file end end; { Main Function } function ParsePage(HTML : string; URL : AnsiString) : Cardinal; begin LogMessage('--- ParsePage Bgn ---'); // LogMessage('[HTML]' + #13 + HTML ); Wait (K_PAUSE_BEFORE_LOADING); if (Pos(K_SEARCH_NOTITLE_TRAIT, HTML) > 0) then begin ShowMessage('No Title Match Found', 'Results Page'); Result := K_PARSE_ERROR; end else if (Pos(K_SEARCH_NOIMAGE_TRAIT, HTML) > 0) then begin ShowMessage('Movie Poster Not Found', 'Results Page'); Result := K_PARSE_ERROR; end else if (Pos(K_SEARCH_RESULTS_TRAIT, HTML) > 0) then begin LogMessage('--- ParseSearchResults ---'); sMode := K_MODE_SEARCH; ParseSearchResults(HTML); Result := K_PARSE_LIST; end else if (Pos(K_SEARCH_PRODUCT_TRAIT, HTML) > 0) then begin LogMessage('--- ParseMovie ---'); sMode := K_MODE_NORMAL; ParseMovie(URL, HTML); { If a poster URL has been filled, then download it } if (sPosterURL <> '') then Result := K_PARSE_DOWNLOAD else Result := K_PARSE_FINISHED end else if (Pos(K_SEARCH_POSTERS_TRAIT, HTML) > 0) then begin LogMessage('--- ParsePoster ---'); sMode := K_MODE_POSTER ParsePoster(HTML); Result := K_PARSE_DOWNLOAD; end else begin ShowMessage('A parsing error has occurred', 'Error'); Result := K_PARSE_ERROR; end; LogMessage('--- ParsePage End ---'); end;