//SCRIPT INFO================================================================================================== BlockOpen (*Following until 'SCRIPT CONSTANTS...' is documentation. Please see 'USER OPTIONS' in the body of the script. --------------------------------------------- AUTHORS: VVV_Easy Contact Web: http://contactbyweb.com/vvv-easy --------------------------------------------- CHANGE LOG : V 1.0.0.0 (20/06/2020) Ivek23: Initial public release --------------------------------------------- FIELD USE: The Personal Video DataBase field names in comments are enclosed in "~" so they are easier to find in the script. The WEB_SPECIFIC commentary points out the specific text for Web fields. Use Log PVdB debug Window for looking search errors. Important note: This scripts don't use the GET PVdB function for download page (this allows use HTTPS pages). For do that it use a specific program "PVdBDownPage" AutoHotKey script. You can get it from the authors page: http://vvveasy.altervista.org/personal-video-database/ NEEDED EXTERNAL FILES IN SCRIPTS FOLDER: • %Path%\PVdBDownPage.exe FOOTNOTES: 1.Control the use of standard fields using the "Overwrite Fields" plugin preferences in the main program PVD: Preferences > Plugins > 'Script Name' > Overwrite fields to control how these items are to be updated. 2.Hits for adapt the Script. 2.1. Search WEB_SPECIFIC comentary for adapt the specific Web text of fields. 2.2. Script execution: 0) Get results of "Obligatory callback Functions" 1) GetDownloadURL (Obligatory callback Functions) = This function should return URL that should be downloaded byd by the main application and then passed to the script’s ParsePage function as text. It may have several modes selon the Script mode (Global Var Mode = smSearch, smNormal, smFinished). 2) ParsePage (Obligatory callback Functions) = This function receives the text of the download web page passeded to the main application in the GetDownloadURL function. It has several modes selon the Script mode (Global Var Mode = smSearch, smNormal, smFinished). KNOWN ISSUES: 1. For compiling cuestions functions must be defined in the script before use (not in order of execution). 2. For the search texts for locating the fields in Web page Null '' value it's not valid. You must replaces all escaped HTML characters (like <>&") with normal characters (like <, >,$, "). 3. If desired, you needs Custom Fields ~IMDB_Votes~,~TOP_250~ for storing the number of votes and TOP250 IMDB list. 4. If not or bad MPAA USA then get Spain certification (if exist) and convert in USA-KODI values. If even this fails try to get of the "user" folders name. s try to get of the "user" folders name. SCRIPT STRUCTURE: 1.Script data and user options constants 2.Some useful generic constants 3.Global variables 4.Obligatory PVD callback Functions GetScriptVersion, GetScriptName, GetScriptDesc, GetBaseURL, GetScriptLang, GetScriptType, GetCurrentMode, GetDownloadURL. (Note: ParsePage is at the end of the file for compiling cuestions). 5.Optional PVD callback Functions GetRatingName ,GetCodePage, GetDownloadMethod, GetPrefixMode; 6.User Functions an procedures (with their constans) 7.Obligatory PVD callback function ParsePage (at the end of the file for compiling cuestions) *) //SCRIPT INFO================================================================================================== BlockClose //SCRIPT CONSTANTS============================================================================================= BlockOpen Const //Script types----------------------------------------------------------------------------------------------------------- stMovies = 0; stPeople = 1; stPoster = 2; stScreenShots = 3; stCover = 4; //Script Obligatory Infos---------------------------------------------------------------------------------------------- SCRIPT_NAME = 'ĘčíîĎîčńę[HTTPS]'; //The most complete information provider SCRIPT_DESC = 'ĘčíîĎîčńę.Ru download Movie info [RU]'; SCRIPT_VERSION = '1.1.0.0'; SCRIPT_TYPE = stMovies; SCRIPT_LANG = $19; //Russian //$0a es-Spanish $0c fr-French $09 en-English $19 ru-Russian RATING_NAME = 'ĘčíîĎîčńę.Ru'; //PVD has ~imdbrating~ for this value CODE_PAGE = 65001; //28591=ISO 8859-1 Latin 1; Western European (ISO). Use: 65001=Unicode (UTF-8) | 0=for Autodetect Autodetect 1251=ANSI Cyrillic; Cyrillic (Windows) //Script Options------------------------------------------------------------------------------------------------------- //Retreive Data Config USE_SAVED_PVDCONFIG = True ; //Use the Overwrite Options of the script saved in pvdconf.ini for avoid download not used pages. Remember PVD only save in exit. PEOPLE_LIMIT = 25; //Limit of number of actors (cast) or of credits (crew) retrieved. GET_FULL_AWARDS = True ; //Download Awards provider page for retreive the info. Otherwise doesn't do nothingh because no info in the principal movie page. EVENTS_LIMIT = 100; //Limit of number of events (USA Academy Awards, Golden Globes, etc) to retrive awards. MAX_IMAGE_HEIGTH = 1200; //Heigth limit of the stored posters. //Process Data Config PRESERVE_PVD_DESCRIPTION_SETTING = True ; //Avoid double use of ~description~ and ~comment~ using only the user check fields table selection otherwise try get "plot_summary" //Process Behaviour Config BYPASS_SILENT = True ; //Ensure critical ShowMessage alerts bypassing Silent PVdB preferences //CHECK_WEBSITE = False ; //Add to SearchResult List the true HTTPS links 'Just to check the website' with the browser CHECK_WEBSITE = True ; //Add to SearchResult List the true HTTPS links 'Just to check the website' with the browser POSTER_IN_SEARCH = True ;//Download and show movie posters in the list of the SearchResult SEARCH_ENGINE = True ; //If there isn't provider search results, try with Bing search engine INTERNET_TEST_ITERATIONS = 6; //Attempts before to alert user that not internet connection detected. Increase if the provider has low speed. //Script data------------------------------------------------------------------------------------------------------------ //Used Web URL BASE_URL_PRE = 'http://www.kinopoisk.ru/'; //The traditional BASE_URL_PREFIX used to get movie ID if the movie is stored for instance 'http://www.imdb.com/title/ tt0068646/'. BASE_URL_PRE_TRUE = 'https://www.kinopoisk.ru/'; //True actual link to movie ID 'httpS://www.imdb.com/title/ tt0068646/' BASE_URL_PERSON_PRE = 'http://www.kinopoisk.ru/name/'; //The traditional BASE_UR to person ID 'httpS://www.imdb.com/name/ nm0094036/' BASE_URL_PERSON_PRE_TRUE = 'https://www.kinopoisk.ru/name/'; //True actual link to person ID 'httpS://www.imdb.com/name/ nm0094036/' BASE_URL_SUF = '/'; //Suffix in the link after MovieID o PersonID 'http://www.imdb.com/title/ tt0068646 /' BASE_URL_IMAGE_PRE = 'http'; //IMDB posters format: Full image: 'https://ia.media-imdb.com/images/M/MV5BMTI2MjI4NTgyNF5BMl5BanBnXkFtZTcwOTM5NzQ5MQ@@.jpg. BASE_URL_IMAGE_PRE_TRUE = 'https'; //Resized image: 'https://ia.media-imdb.com/images/M/MV5BMTI2MjI4NTgyNF5BMl5BanBnXkFtZTcwOTM5NzQ5MQ@@._V1_UY50_CR0,0,34,50_AL_.jpg https://st.kp.yandex.net/images/ // where the two last number are width andheigth //Cast provider page. WEB_SPECIFIC. BASE_URL_AWARDS='https://www.kinopoisk.ru/film/%KINOPOISK_ID/awards/'; //Awards provider page. WEB_SPECIFIC. BASE_URL_SEARCH_PROV ='https://www.kinopoisk.ru/index.php?level=7&from=forma&result=adv&m_act%5Bfrom%5D=forma&m_act%5Bwhat%5D=content&m_act%5Bfind%5D=%s'; //Search string for '%s' title and '%y' year. WEB_SPECIFIC BASE_URL_PERSON_SEARCH_PROV ='https://www.imdb.com/search/name?name=%s&sort=starmeter+desc&ref_=rlm'; //Search string for '%s' name. WEB_SPECIFIC MAX_SEARCHLIST_HEIGTH = 52; //Heigth limit of the search list posters. BASE_URL_SEARCH_ENGI = 'http://www.bing.com/Search?q=%s%20+(%y)+site%3A%p'; // Search string: '%s' title , '%y' year and '%p' web information provider. //Download HTTPS needed parameters BASE_URL_ROUNDABOUT = 'ROUNDABOUT'; //Used for cheat GET PVdB funtion and rondabout the "https" fail. BASE_DOWNLOAD_FILE_NO_BOM = 'Tmp\downpage-UTF8_NO_BOM.htm'; //File to store curl page download in UTF8 without BOM and then it's not necesary use GET PVdB funtion to download. BASE_DOWNLOAD_FILE_IMAGE_NAME = 'Tmp\downimage-BIN'; //File to store curl image download in binary and then it's not necesary use GET PVdB funtion to download. //CHEAT_PREFIX_URL = 'http://www.jsontest.com/'+' '; //Working http URL used for cheat GET PVdB funtion when it returns for SearchList choice. CHEAT_PREFIX_URL = 'http://httpbin.org/response-headers?key='; //Working http URL used for cheat GET PVdB funtion when it returns for SearchList choice. DUMMY_HTML_FILE = 'portable.bat'; //Any existing PVdV file (little) not used. If adapted, it may external file 'C:\Windows\notepad.exe' //Script movie modes.---------------------------------------------------------------------------------------------------- smSearch = 0; //Entry mode and search list mode (AddSearchResult) smNormal = 1; //This scripts download with external program (not with GetDownloadURL) so it only make one pass to ParsePage for retrieve all info, credits, poster, etc. other field modes aren't necesary. //Movie PVdB fields in http://www.videodb.info/help/hlp_scripting.html#fields: //Certification (AddValueField): ~mpaa~ //Credits (AddMoviePerson): ~Directors~,~Writers~,~Composers~,~Photographers~,~Actors~,~Producer~.Same that smCast.hat smCast. //Votes (AddValueField): ~rating~,~imdbrating~,~orname~,~orating~ and related custom PVdB fields ~IMDB_Votes~,~TOP_250~,~FilmAffinity_Votes~. //Poster (AddValueImageURL): ~poster~,~screenshots~,~froncover~,~cdcover~ //Review (AddValueField): ~comment~,~tags~ //Awards (AddAwards). smSearchList = 8; //Used in ParsePage for demands download the https link returned by user in the window of (AddSearchResult)SearchResult) smFinished = 9; //For set script finish. //Parse results (return of Script)--------------------------------------------------------------------------------------- prError = 0; //An error acquired while processing data prFinished = 1; //Script has finished gathering data prList = 2; //A list of search results is available. Use with (AddSearchResult) prListImage = 3; //A list of image search results is available. Use with? prDownload = 4; //Another URL needs to be downloaded //Download methods------------------------------------------------------------------------------------------------------- dmGET = 0; dmPOST = 1; //Movie Fields to Receive types---------------------------------------------------------------------------------------------------------- gfID = 1; gfTitle = 2; gfOrigTitle = 3; gfAka = 4; gfYear = 5; gfMPAA = 6; gfURL = 8; gfIMDBRating = 9; gfORating = 11; gfScriptName = 12; // gfRatingName gfTagLine = 14; gfDescription = 15; gfDateAdded = 17; gfResolution = 21; gfTypeCarrier = 32; gfGenre = 44; gfCountry = 45; gfCategory = 46; gfActors = 47; gfDirector = 53; gfScenario = 54; gfComposer = 55; gfProducer = 56; gfTags = 0; gfStudio = 0; gfActor = 0; gfFirstWorld = 0; gfBudget = 0; gfMoneyWorld = 0; //Credits types---------------------------------------------------------------------------------------------------------- ctActors = 0; ctDirectors = 1; ctWriters = 2; ctComposers = 3; ctProducers = 4; //Image types------------------------------------------------------------------------------------------------------------ itPoster = 0; itScreenShot = 1; itFrontCover = 2; itDiscImage = 3; itPhoto = 4; //Field Overwrite Options position in pvdconf.ini------------------------------------------------------------------------ //0=Do nothing,1=Set if Empty,2=Overwrite. The Length of 'IMDB_[EN][HTTPS].psf=' is 21. opPoster = 87-21; opAKA = 24-21; opDirector = 76-21; opProducer = 79-21; opWriter = 77-21; opComposer = 78-21; opActors = 75-21; opMPAA = 27-21; opAwards = 85-21; opFeatures = 55-21; opConnections = 84-21; opEpisodes = 92-21; //SCRIPT CONSTANTS============================================================================================= BlockClose //SCRIPT GLOBAL VARIABLES=======================================================================================BlockOpen Var Mode:Byte; DownloadURL:String; StoredURL:String; MediaType:String; //'Movie''TVEpisode' PVDConfigOptions:String; convertlink,newLinkFormat, createLink, formattedTime, miniPoster, LongDate, loadFee, loadExtraRole, simpleTitle, transRusOrigTitle, formattedURL, addLikeFilms2Links, needPreviewInSearch, makeStudiosIsStandard, effectStudiosIsStandard, saleStudiosIsStandard, managerIsProducer : Boolean; szPosterX, szPosterY, nationality, RusNames, ShowPersonAs, maxOpinion, maxOpinionURL, maxCharInOpinion, maxPersons, placeTimeSerial, maxStudios, maxStudiosInCat, optURL, optOrigTitle, optTitle, optAka, optYear, optCountry, optTagline, optGenre, optBudgetM, optMoneyWorldM, optFirstWorldM, optMPAA, optDescription, optRating, optRatingIMDB, optMoneyUSA, optMoneyRUS, optMoneyOther, optViewers, optBudgetU, optMarketing, optMoneyWorldU, optFirstRUS, optReleaseDVD, optReleaseBD, optTime, optFirstWorldU, optTop250, optCategory, optOpinion, optPrognosRating, optDoYouKnow, optDirector, optActor, optProducer, optScenario, optComposer, optOperator, optDouble, optManager, optDirectorDouble, optDesign , optEditor , optActorDouble , optSites, optMakeStudio, optEffectStudio, optSaleStudio, optStudio, optTags, optConnection, optAward, optMoreAwards, optKinoCritic, optReview, optEpisode, optTimeSerial, optPosters, optCost, optLimitedWeekend, optFirstWeekend, optMaxCinema, optLimitedShow, optGeneralShow, optEndShow, optTimeShow, optNetAvails, optSoundtrack, optVersion, pgDoYouKnow, pgPersons, pgSites, pgStudio, pgWords, pgList, pgAwards, pgKinoCritic, pgReview, pgSeasons, pgPosters, pgTake, pgSoundtrack, Delay, optVotesIMDB, optVotesKinopoisk : Integer; ListDelim, ListSign, russianCountry, ufPrefix, ufPostfix, login, password, EmptyCategory, ufBudget, ufMarketing, ufMoneyUSA, ufMoneyRus, ufMoneyOther, ufMoneyWorld, ufViewers, ufFirstWorld, ufFirstRUS, ufReleaseDVD, ufReleaseBD, ufTime, ufTimeSerial, ufTop250, ufDoYouKnow, ufOperator, ufManager, ufDouble, ufDirectorDouble, ufSites, ufMakeStudio, ufEffectStudio, ufSaleStudio, ufKinoCritic, ufReview, ufMoreAwards, ufOpinion, ufPrognosRating, ufCost, ufLimitedWeekend, ufFirstWeekend, ufMaxCinema, ufLimitedShow, ufGeneralShow, ufEndShow, ufTimeShow, ufNetAvails, ufSoundtrack, ufVersion, ufVotesIMDB, ufVotesKinopoisk : String; // Resha 15.09.2014 { optReleaseBDDateOnly : Integer; // } Resha ztt : integer; Const Disabled = 0; // Опция включена, поле обновляется Enabled = 1; // Опция отключена, поле не обновляется Empty = 2; // Обновляется только пустое поле (действует на опции, помеченные +e) const mcDebug = 0; // Уникальные символы при парсинге // Заполнены и вынесены в константы не все mcSearchOk = 'Результаты поиска ('; // Поиск успешно завершен mcNotFound = 'К сожалению, по вашему запросу ничего не найдено.'; // Ничего не найдено mcFilmAbout = 'alt="всё о кино">'; // Мы на странице с фильмом mcFilmFirst = '<!-- инфа о фильме -->'; // Начало инфы о фильме mcSearchFirst = 'Скорее всего, вы ищете'; // Начало страницы поиска mcSearchEnd = '<!-- Правая сторона -->'; // Конец страницы поиска mcFilmLink1 = '<p class="name"><a href="'; // Начало. Ссылка на фильм со страницы поиска mcFilmLink2 = '">'; // Конец. Ссылка на фильм со страницы поиска mcFilmEnd = '>Добавить свой отзыв<'; Const pathToConfig = '%P\Scripts\kinopoisk.cfg'; // Укажите полный путь к файлу конфигурации procedure InitOptions (); Begin convertlink := true; // конвертировать ссылки в новый совместимый формат newLinkFormat := false; // Новый формат ссылок для фильмов и персон createLink := true; // Признак добавления тегов <link> в пользовательские поля formattedTime := true; // Признак преобразования длительности фильма из минут в формат чч:мм:сс miniPoster := false; // Признак загрузки постера с основной страницы (если false, грузится со страницы постеров) szPosterX := 800; // Размер постера для загрузки по ширине szPosterY := 1200; // Размер постера для загрузки по высоте ListDelim := #13#10; // Разделитель элементов списка (последовательность #13#10 - новая строка, // повторите два раза - будет пустая строка) ListSign := '» '; // Начало элемента списка nationality := 0; // Указание гос.принадлежности фильмов // 0 - автоматическое определение // фильм с наличием переведенного названия считается зарубежным // иначе фильм с большим кол-вом латинских букв - зарубежный // фильм с большим кол-вом русских букв - русский // фильм с одинаковым кол-вом русских и латинских букв русский, // если первая страна-производитель входит в список russianCountry // 1 - все фильмы - зарубежные // 2 - все фильмы - русские // 3 - фильмы, у которых первая страна-производитель находится // в списке опции russianCountry, - русские, остальные - зарубежные russianCountry := 'Россия,СССР'; // Указание русских стран. Не забываем про Россию и СССР. // Страны перечисляются через запятую без пробелов. // Написание стран должно соответствовать написанию на сайте КиноПоиска RusNames := 1; // правила занесения имени русской персоны // национальность персоны определяется косвенно по гос.принадлежности фильма // персоны в полях "Режиcсеры дубляжа" и "Роли дублировали" всегда русские // 0 - имя транслит, переведенное имя русское // 1 - имя русское, переведенное имя транслит // 2 - имя русское, переведенное имя русское ShowPersonAs := 5; // Заносить персон в пользовательские поля как... // 0 - имя // 1 - переведенное имя // 2 - имя / переведенное имя // 3 - имя ... роль // 4 - переведенное имя ... роль // 5 - имя / переведенное имя ... роль LongDate := false; // true - отображение даты в длинном формате (01 января 2000) // false - отображение даты в коротком формате (01.01.2000) ufPrefix := ''; // Префикс для имен пользовательских полей ufPostfix := ''; // Постфикс для имен пользовательских полей (можно добавить ":") loadFee := true; // Загружать гонорары актеров после их роли loadExtraRole := true; // Загружать в роль актера дополнительную информацию: не указан в титрах, озвучка maxOpinion := 1; // Максимальное количество отзывов зрителей (на одной странице 10 отзывов, 0 - без ограничений) maxOpinionURL := -1; // Максимальное количество ссылок на незагруженные отзывы зрителей (0 - без ограничений, -1 - не грузить) maxCharInOpinion := 18000; // Максимальное количество символов для загрузки в поле "Отзывы зрителей". // Для ветки 0.9.8.x лучше не трогать // Для ветки 0.9.9.x можно установить в 0 - без ограничений login := ''; // Имя пользователя (вводить между кавычками) password := ''; // Пароль пользователя (вводить между кавычками) maxPersons := 100; // Максимальное количество загружаемых персон каждого типа (режиссеры, операторы, актеры и т.д.) managerIsProducer := false; // Заносить директоров фильма в поле "Продюсеры" placeTimeSerial := 0; // Размещение полной длительности сериала // 0 - в пользовательском поле "Длительность" // 1 - в пользовательском поле "Длительность сериала" maxStudios := 0; // Максимальное количество студий для загрузки во встроенное поле программы // (0 - без ограничений) maxStudiosInCat := 0; // Максимальное количество студий в каждой из категорий // ("Студии. Производство", "Студии. Прокат", "Студии. Спецэффекты") // для загрузки (0 - без ограничений) makeStudiosIsStandard := true; // Загружать "Студии. Производство" в стандартное поле "Студии" effectStudiosIsStandard := true; // Загружать "Студии. Прокат" в стандартное поле "Студии" saleStudiosIsStandard := true; // Загружать "Студии. Спецэффекты" в стандартное поле "Студии" EmptyCategory := 'полнометражный фильм'; // Категория, помещаемая в поле Категория // при отсутствии в названии фильма слов ТВ, видео, сериал simpleTitle := false; // Замена разного рода кавычек на классические одинарные // true - заменять // false - оставлять, как есть transRusOrigTitle := false; // Транслитерация русского оригинального названия фильма // true - записывать в оригинальное название транслитерированное // false - записывать в оригинальное название русское formattedURL := true; // Форматированные ссылки (не влияет на стандартное поле URL, работает только при createLink = true) // true - из ссылки убирается "http://", "www." и всё после "/", // остается видимым только домен, но ссылка указывает на полный адрес // false - ссылка подставляется как есть addLikeFilms2Links := true; // Добавление похожих фильмов в связи // true - добавлять // false - не добавлять needPreviewInSearch := true; // Загрузка минипостеров фильмов в окне поиска // true - загружать и отображать // false - не загружать Delay := 0; // Пауза между загрузками страниц в десятых долях секунды // Загрузка основной страницы фильма - отключить нельзя optURL := Enabled; // URL фильма optOrigTitle := Enabled; // Оригинальное название (+e) optTitle := Enabled; // Название (+e) optAka := Enabled; // Другие названия (+e) optYear := Enabled; // Год выхода (+e) optCountry := Enabled; // Страна (+e) optTagline := Enabled; // Слоган (+e) optGenre := Enabled; // Жанр (+e) optBudgetM := Enabled; // Бюджет optMoneyWorldM := Enabled; // Сборы в мире optFirstWorldM := Enabled; // Дата выпуска optMPAA := Enabled; // Рейтинг MPAA (+e) optDescription := Enabled; // Описание (+e) optRating := Enabled; // Рейтинг КиноПоиска (+e) optVotesKinopoisk := Enabled; // Голоса (КиноПоиск) optRatingIMDB := Disabled; // Рейтинг IMDB (+e) optVotesIMDB := Disabled; // Голоса (IMDB) optMoneyUSA := Enabled; // Сборы в США (+e) optMoneyRUS := Enabled; // Сборы в России (+e) optMoneyOther := Enabled; // Сборы в др. странах (+e) optViewers := Enabled; // Зрители optBudgetU := Enabled; // Бюджет optMarketing := Enabled; // Маркетинг optMoneyWorldU := Enabled; // Сборы в мире optFirstRUS := Enabled; // Премьера в России optReleaseDVD := Enabled; // Релиз на DVD optReleaseBD := Enabled; // Релиз на Blu-Ray optReleaseBDDateOnly := Enabled; // Релиз на Blu-Ray - только дата, без текста optTime := Enabled; // Длительность optFirstWorldU := Enabled; // Мировая премьера optTop250 := Enabled; // Top250 optCategory := Enabled; // Категории optOpinion := Enabled; // Отзывы зрителей optPrognosRating := Enabled; // Прогнозируемая оценка optVersion := Enabled; // Версия скрипта pgDoYouKnow := Enabled; // Загрузка страницы "Знаете ли Вы, что..." optDoYouKnow := Enabled; // Знаете ли вы, что pgPersons := Enabled; // Загрузка страницы Создатели optDirector := Enabled; // Режиссеры optActor := Enabled; // Актеры optProducer := Enabled; // Продюссеры optScenario := Enabled; // Сценаристы optComposer := Enabled; // Композиторы optOperator := Enabled; // Операторы optDouble := Enabled; // Роли дублировали optManager := Enabled; // Директора фильма optDirectorDouble := Enabled; // Режиссеры дубляжа optDesign := Enabled; // Художник optEditor := Enabled; // Монтаж optActorDouble := Enabled; // Актер Дубляжа pgSites := Enabled; // Загрузка страницы Сайты optSites := Enabled; // Сайты pgStudio := Enabled; // Загрузка страницы Студии optMakeStudio := Enabled; // Студии. Производство optEffectStudio := Enabled; // Студии. Спецэффекты optSaleStudio := Enabled; // Студии. Прокат optStudio := Enabled; // Студии pgWords := Enabled; // Загрузка страницы Слова optTags := Enabled; // Теги pgList := Enabled; // Загрузка страницы Связи optConnection := Enabled; // Связи pgAwards := Enabled; // Загрузка страницы Награды optAward := Enabled; // Награды optMoreAwards := Enabled; // Дополнительные награды pgKinoCritic := Enabled; // Загрузка страницы Кинокритика optKinoCritic := Enabled; // Кинокритика pgReview := Enabled; // Загрузка страницы Рецензия optReview := Enabled; // Рецензия pgSeasons := Enabled; // Загрузка страницы Сезоны optEpisode := Enabled; // Эпизоды optTimeSerial := Enabled; // Полное время сериала pgPosters := Enabled; // Загрузка страницы Постеры optPosters := Enabled; // Постеры pgTake := Enabled; // Кассовые сборы optNetAvails := Enabled; // Чистая выручка кииностудии optCost := Enabled; // Всего затрат optLimitedWeekend := Enabled; // Первый уик-энд (США). Ограниченный прокат optFirstWeekend := Enabled; // Первый уик-энд (США). Широкий прокат optMaxCinema := Enabled; // Первый уик-энд (США). Макс. кол-во кинотеатров (США) optLimitedShow := Enabled; // Ограниченный прокат (США) optGeneralShow := Enabled; // Широкий прокат (США) optEndShow := Enabled; // Окончание проката (США) optTimeShow := Enabled; // Время проката pgSoundtrack := Disabled; // Саундтреки optSoundtrack := Enabled; // Саундтреки //*********************************** //Пользовательские поля. //Скрипт заполняет их по имени, так что возможны два варианта: // либо подогнать имена полей в базе, чтоб они соответствовали этим // либо подогнать именя полей тут, чтоб они соответствовали базе ufBudget := 'Бюджет' ; //Короткий текст ufMarketing := 'Маркетинг' ; //Короткий текст ufMoneyUSA := 'Сборы в США' ; //Короткий текст ufMoneyRus := 'Сборы в России' ; //Короткий текст ufMoneyOther := 'Сборы в др. странах' ; //Короткий текст ufMoneyWorld := 'Сборы в мире' ; //Короткий текст ufViewers := 'Зрители' ; //Длинный текст ufFirstWorld := 'Премьера (мир)' ; //Короткий текст ufFirstRUS := 'Премьера (РФ)' ; //Короткий текст ufReleaseDVD := 'Релиз на DVD' ; //Короткий текст ufReleaseBD := 'Релиз на Blu-Ray' ; //Короткий текст ufTime := 'Длительность' ; //Короткий текст ufTimeSerial := 'Длительность сериала'; //Короткий текст ufTop250 := 'Top250' ; //Короткий текст ufDoYouKnow := 'Знаете ли Вы, что' ; //Memo ufOperator := 'Операторы' ; //Memo ufManager := 'Директора фильма' ; //Memo ufDouble := 'Роли дублировали' ; //Memo ufDirectorDouble := 'Режиcсеры дубляжа' ; //Memo ufSites := 'Сайты' ; //Memo ufMakeStudio := 'Студии. Производство'; //Memo ufEffectStudio := 'Студии. Спецэффекты' ; //Memo ufSaleStudio := 'Студии. Прокат' ; //Memo ufKinoCritic := 'Кинокритика' ; //Memo ufReview := 'Рецензия' ; //Memo ufMoreAwards := 'Доп. награды' ; //Memo ufOpinion := 'Отзывы зрителей' ; //Memo ufPrognosRating := 'Прогн. оценка' ; //Короткий текст для 0.9.8.x и Rating для 0.9.9.x ufCost := 'Всего затрат' ; //Короткий текст ufNetAvails := 'Выручка к/с' ; //Короткий текст ufLimitedWeekend := 'Перв. уик-энд (США). Огр. прокат'; //Короткий текст ufFirstWeekend := 'Перв. уик-энд (США). Шир. прокат'; //Короткий текст ufMaxCinema := 'Перв. уик-энд (США). Макс. к/т'; //Короткий текст ufLimitedShow := 'Огр. прокат (США)' ; //Короткий текст ufGeneralShow := 'Шир. прокат (США)' ; //Короткий текст ufEndShow := 'Конец проката (США)' ; //Короткий текст ufTimeShow := 'Время проката (США), дн./нед.'; //Короткий текст ufSoundtrack := 'Саундтреки' ; //Memo ufVersion := 'Версия скрипта' ; //Короткий текст ufVotesIMDB := 'Голоса (IMDB)' ; //Число ufVotesKinopoisk := 'Голоса (Кинопоиск)' ; //Число End; procedure GetBoolOption (const Data, Name: String; var opt: Boolean); Var curPos, endPos: Integer; tmp : String; Begin if Name = '' then Exit; curPos := Pos (Name + ' ', Data); if curPos = 0 then Exit; curPos := PosFrom ('=', Data, curPos) + 1; endPos := PosFrom (';', Data, curPos); if (curPos = 0) Or (endPos = 0) then Exit; tmp := LowerCase (Trim (Copy (Data, curPos, endPos - curPos))); if (tmp = 'true') Or (tmp = 'enabled') then opt := true else if (tmp = 'false') Or (tmp = 'disabled') then opt := false; End; procedure GetFieldOption (const Data, Name: String; var opt: Integer); Var curPos, endPos: Integer; tmp : String; Begin if Name = '' then Exit; curPos := Pos (Name + ' ', Data); if curPos = 0 then Exit; curPos := PosFrom ('=', Data, curPos) + 1; endPos := PosFrom (';', Data, curPos); if (curPos = 0) Or (endPos = 0) then Exit; tmp := LowerCase (Trim (Copy (Data, curPos, endPos - curPos))); if tmp = 'enabled' then opt := Enabled else if tmp = 'disabled' then opt := Disabled else if tmp = 'empty' then opt := Empty; // else if tmp = 'Add' then // opt := Add; End; procedure GetIntOption (const Data, Name: String; var opt: Integer); Var curPos, endPos: Integer; tmp : String; Begin if Name = '' then Exit; curPos := Pos (Name + ' ', Data); if curPos = 0 then Exit; curPos := PosFrom ('=', Data, curPos) + 1; endPos := PosFrom (';', Data, curPos); if (curPos = 0) Or (endPos = 0) then Exit; tmp := Trim (Copy (Data, curPos, endPos - curPos)); if tmp = '' then Exit; opt := StrToInt (tmp); End; procedure GetStrOption (const Data, Name: String; var opt: String); Var curPos : Integer; quoting : Boolean; str : String; Begin if Name = '' then Exit; curPos := Pos (Name + ' ', Data); if curPos = 0 then Exit; curPos := PosFrom ('=', Data, curPos); opt := ''; while (quoting) Or (Data[curPos + 1] <> ';') do begin Inc (curPos); if (Data[curPos] = '''') And ((Not quoting) Or (Data[curPos + 1] <> '''')) then quoting := Not quoting; if quoting then str := 'true' else str := 'false'; if (Data[curPos] = '''') then Continue; if quoting Or (Data[curPos] <> ' ') then opt := opt + Data[curPos]; end; opt := StringReplace (opt, '#13#10', #13#10, true, true, false); End; procedure SetUFOption (var opt: String); Begin opt := ufPrefix + opt + ufPostfix; End; procedure LoadOptions (); Var Data : String; path : String; Begin path := StringReplace (pathToConfig, '%P', GetAppPath, true, true, false); path := StringReplace (path, '%D', GetDBPath, true, true, false); Data := FileToString (path); if Data <> '' then begin GetBoolOption (Data, 'newLinkFormat', newLinkFormat); GetBoolOption (Data, 'createLink', createLink); GetBoolOption (Data, 'formattedTime', formattedTime); GetBoolOption (Data, 'miniPoster', miniPoster); GetBoolOption (Data, 'LongDate', LongDate); GetBoolOption (Data, 'loadFee', loadFee); GetBoolOption (Data, 'loadExtraRole', loadExtraRole); GetBoolOption (Data, 'simpleTitle', simpleTitle); GetBoolOption (Data, 'transRusOrigTitle', transRusOrigTitle); GetBoolOption (Data, 'formattedURL', formattedURL); GetBoolOption (Data, 'addLikeFilms2Links', addLikeFilms2Links); GetBoolOption (Data, 'needPreviewInSearch', needPreviewInSearch); GetBoolOption (Data, 'makeStudiosIsStandard', makeStudiosIsStandard); GetBoolOption (Data, 'effectStudiosIsStandard', effectStudiosIsStandard); GetBoolOption (Data, 'saleStudiosIsStandard', saleStudiosIsStandard); GetBoolOption (Data, 'managerIsProducer', managerIsProducer); GetFieldOption (Data, 'optURL', optURL); GetFieldOption (Data, 'optOrigTitle', optOrigTitle); GetFieldOption (Data, 'optTitle', optTitle); GetFieldOption (Data, 'optAka', optAka); GetFieldOption (Data, 'optYear', optYear); GetFieldOption (Data, 'optCountry', optCountry); GetFieldOption (Data, 'optTagline', optTagline); GetFieldOption (Data, 'optGenre', optGenre); GetFieldOption (Data, 'optBudgetM', optBudgetM); GetFieldOption (Data, 'optMoneyWorldM', optMoneyWorldM); GetFieldOption (Data, 'optFirstWorldM', optFirstWorldM); GetFieldOption (Data, 'optMPAA', optMPAA); GetFieldOption (Data, 'optDescription', optDescription); GetFieldOption (Data, 'optRating', optRating); GetFieldOption (Data, 'optRatingIMDB', optRatingIMDB); GetFieldOption (Data, 'optVotesIMDB', optVotesIMDB); GetFieldOption (Data, 'optVotesKinopoisk', optVotesKinopoisk); GetFieldOption (Data, 'optMoneyUSA', optMoneyUSA); GetFieldOption (Data, 'optMoneyRUS', optMoneyRUS); GetFieldOption (Data, 'optMoneyOther', optMoneyOther); GetFieldOption (Data, 'optViewers', optViewers); GetFieldOption (Data, 'optBudgetU', optBudgetU); GetFieldOption (Data, 'optMarketing', optMarketing); GetFieldOption (Data, 'optMoneyWorldU', optMoneyWorldU); GetFieldOption (Data, 'optFirstRUS', optFirstRUS); GetFieldOption (Data, 'optReleaseDVD', optReleaseDVD); GetFieldOption (Data, 'optReleaseBD', optReleaseBD); // Resha 15.09.2014 { Для поля Релиз на Blue-Ray использовать только дату, без студии GetFieldOption (Data, 'optReleaseBDDateOnly', optReleaseBDDateOnly); // } Resha GetFieldOption (Data, 'optTime', optTime); GetFieldOption (Data, 'optFirstWorldU', optFirstWorldU); GetFieldOption (Data, 'optTop250', optTop250); GetFieldOption (Data, 'optCategory', optCategory); GetFieldOption (Data, 'optOpinion', optOpinion); GetFieldOption (Data, 'optPrognosRating', optPrognosRating); GetFieldOption (Data, 'pgDoYouKnow', pgDoYouKnow); GetFieldOption (Data, 'optDoYouKnow', optDoYouKnow); GetFieldOption (Data, 'pgPersons', pgPersons); GetFieldOption (Data, 'optDirector', optDirector); GetFieldOption (Data, 'optActor', optActor); GetFieldOption (Data, 'optProducer', optProducer); GetFieldOption (Data, 'optScenario', optScenario); GetFieldOption (Data, 'optComposer', optComposer); GetFieldOption (Data, 'optOperator', optOperator); GetFieldOption (Data, 'optDouble', optDouble); GetFieldOption (Data, 'optManager', optManager); GetFieldOption (Data, 'optDirectorDouble', optDirectorDouble); GetFieldOption (Data, 'pgSites', pgSites); GetFieldOption (Data, 'optSites', optSites); GetFieldOption (Data, 'pgStudio', pgStudio); GetFieldOption (Data, 'optMakeStudio', optMakeStudio); GetFieldOption (Data, 'optEffectStudio', optEffectStudio); GetFieldOption (Data, 'optSaleStudio', optSaleStudio); GetFieldOption (Data, 'optStudio', optStudio); GetFieldOption (Data, 'pgWords', pgWords); GetFieldOption (Data, 'optTags', optTags); GetFieldOption (Data, 'pgList', pgList); GetFieldOption (Data, 'optConnection', optConnection); GetFieldOption (Data, 'pgAwards', pgAwards); GetFieldOption (Data, 'optAward', optAward); GetFieldOption (Data, 'optMoreAwards', optMoreAwards); GetFieldOption (Data, 'pgKinoCritic', pgKinoCritic); GetFieldOption (Data, 'optKinoCritic', optKinoCritic); GetFieldOption (Data, 'pgReview', pgReview); GetFieldOption (Data, 'optReview', optReview); GetFieldOption (Data, 'pgSeasons', pgSeasons); GetFieldOption (Data, 'optEpisode', optEpisode); GetFieldOption (Data, 'optTimeSerial', optTimeSerial); GetFieldOption (Data, 'pgPosters', pgPosters); GetFieldOption (Data, 'optPosters', optPosters); GetFieldOption (Data, 'pgTake', pgTake); GetFieldOption (Data, 'optCost', optCost); GetFieldOption (Data, 'optFirstWeekend', optFirstWeekend); GetFieldOption (Data, 'optMaxCinema', optMaxCinema); GetFieldOption (Data, 'optGeneralShow', optGeneralShow); GetFieldOption (Data, 'pgSoundtrack', pgSoundtrack); GetFieldOption (Data, 'optSoundtrack', optSoundtrack); GetFieldOption (Data, 'optVersion', optVersion); GetIntOption (Data, 'szPosterX', szPosterX); GetIntOption (Data, 'szPosterY', szPosterY); GetIntOption (Data, 'nationality', nationality); GetIntOption (Data, 'RusNames', RusNames); GetIntOption (Data, 'ShowPersonAs', ShowPersonAs); GetIntOption (Data, 'maxOpinion', maxOpinion); GetIntOption (Data, 'maxOpinionURL', maxOpinionURL); GetIntOption (Data, 'maxCharInOpinion', maxCharInOpinion); GetIntOption (Data, 'maxPersons', maxPersons); GetIntOption (Data, 'placeTimeSerial', placeTimeSerial); GetIntOption (Data, 'maxStudios', maxStudios); GetIntOption (Data, 'maxStudiosInCat', maxStudiosInCat); GetStrOption (Data, 'ListDelim', ListDelim); GetStrOption (Data, 'ListSign', ListSign); GetStrOption (Data, 'russianCountry', russianCountry) GetStrOption (Data, 'ufPrefix', ufPrefix); GetStrOption (Data, 'ufPostfix', ufPostfix); GetStrOption (Data, 'login', login); GetStrOption (Data, 'password', password); GetStrOption (Data, 'EmptyCategory', EmptyCategory); GetStrOption (Data, 'ufBudget', ufBudget); GetStrOption (Data, 'ufMarketing', ufMarketing); GetStrOption (Data, 'ufCost', ufCost); GetStrOption (Data, 'ufMoneyUSA', ufMoneyUSA); GetStrOption (Data, 'ufMoneyRus', ufMoneyRus); GetStrOption (Data, 'ufMoneyOther', ufMoneyOther); GetStrOption (Data, 'ufMoneyWorld', ufMoneyWorld); GetStrOption (Data, 'ufViewers', ufViewers); GetStrOption (Data, 'ufFirstWorld', ufFirstWorld); GetStrOption (Data, 'ufFirstRUS', ufFirstRUS); GetStrOption (Data, 'ufReleaseDVD', ufReleaseDVD); GetStrOption (Data, 'ufReleaseBD', ufReleaseBD); GetStrOption (Data, 'ufTime', ufTime); GetStrOption (Data, 'ufTimeSerial', ufTimeSerial); GetStrOption (Data, 'ufTop250', ufTop250); GetStrOption (Data, 'ufDoYouKnow', ufDoYouKnow); GetStrOption (Data, 'ufOperator', ufOperator); GetStrOption (Data, 'ufManager', ufManager); GetStrOption (Data, 'ufDouble', ufDouble); GetStrOption (Data, 'ufDirectorDouble', ufDirectorDouble); GetStrOption (Data, 'ufSites', ufSites); GetStrOption (Data, 'ufMakeStudio', ufMakeStudio); GetStrOption (Data, 'ufEffectStudio', ufEffectStudio); GetStrOption (Data, 'ufSaleStudio', ufSaleStudio); GetStrOption (Data, 'ufKinoCritic', ufKinoCritic); GetStrOption (Data, 'ufReview', ufReview); GetStrOption (Data, 'ufMoreAwards', ufMoreAwards); GetStrOption (Data, 'ufOpinion', ufOpinion); GetStrOption (Data, 'ufPrognosRating', ufPrognosRating); GetStrOption (Data, 'ufLimitedWeekend', ufLimitedWeekend); GetStrOption (Data, 'ufFirstWeekend', ufFirstWeekend); GetStrOption (Data, 'ufMaxCinema', ufMaxCinema); GetStrOption (Data, 'ufLimitedShow', ufLimitedShow); GetStrOption (Data, 'ufGeneralShow', ufGeneralShow); GetStrOption (Data, 'ufEndShow', ufEndShow); GetStrOption (Data, 'ufTimeShow', ufTimeShow); GetStrOption (Data, 'ufNetAvails', ufNetAvails); GetStrOption (Data, 'ufSoundtrack', ufSoundtrack); GetStrOption (Data, 'ufVersion', ufVersion); GetStrOption (Data, 'ufVotesIMDB', ufVotesIMDB); GetStrOption (Data, 'ufVotesKinopoisk', ufVotesKinopoisk); end; SetUFOption (ufBudget); SetUFOption (ufMarketing); SetUFOption (ufCost); SetUFOption (ufMoneyUSA); SetUFOption (ufMoneyRus); SetUFOption (ufMoneyOther); SetUFOption (ufMoneyWorld); SetUFOption (ufViewers); SetUFOption (ufFirstWorld); SetUFOption (ufFirstRUS); SetUFOption (ufReleaseDVD); SetUFOption (ufReleaseBD); SetUFOption (ufTime); SetUFOption (ufTimeSerial); SetUFOption (ufTop250); SetUFOption (ufDoYouKnow); SetUFOption (ufOperator); SetUFOption (ufManager); SetUFOption (ufDouble); SetUFOption (ufDirectorDouble); SetUFOption (ufSites); SetUFOption (ufMakeStudio); SetUFOption (ufEffectStudio); SetUFOption (ufSaleStudio); SetUFOption (ufKinoCritic); SetUFOption (ufReview); SetUFOption (ufMoreAwards); SetUFOption (ufOpinion); SetUFOption (ufPrognosRating); SetUFOption (ufLimitedWeekend); SetUFOption (ufFirstWeekend); SetUFOption (ufMaxCinema); SetUFOption (ufLimitedShow); SetUFOption (ufGeneralShow); SetUFOption (ufEndShow); SetUFOption (ufTimeShow); SetUFOption (ufNetAvails); SetUFOption (ufSoundtrack); SetUFOption (ufVersion); SetUFOption (ufVotesIMDB); SetUFOption (ufVotesKinopoisk); End; //SCRIPT GLOBAL VARIABLES=======================================================================================BlockClose //OBLIGATORY CALLBACK FUNCTIONS=================================================================================BlockOpen Function GetScriptVersion:String; //BlockOpen Begin Result:=SCRIPT_VERSION; End; //BlockClose Function GetScriptName:String; //BlockOpen Begin Result:=SCRIPT_NAME; End; //BlockClose Function GetScriptDesc:String; //BlockOpen Begin Result:=SCRIPT_DESC; End; //BlockClose Function GetBaseURL:AnsiString; //BlockOpen Begin Result := BASE_URL_ROUNDABOUT; //Used for cheat GET PVdB funtion and rondabout the "https" fail. End; //BlockClose Function GetScriptLang:Cardinal; //BlockOpen Begin Result:=SCRIPT_LANG; End; //BlockClose Function GetScriptType:Byte; //BlockOpen Begin Result:=SCRIPT_TYPE; End; //BlockClose Function GetCurrentMode:Byte; //BlockOpen Begin Result:=Mode; End; //BlockClose Function GetDownloadURL:AnsiString; //BlockOpen Var curPos:Integer; ScriptPath,MovieID:String; Begin LogMessage('Function GetDownloadURL BEGIN======================|'); LogMessage('Global Var-Mode|'+IntToStr(Mode)+'|'); LogMessage('Global Var-DownloadURL|'+DownloadURL+'|'); //Comprobation of needed external files. ScriptPath:=GetAppPath+'Scripts\'; If Not(FileExists(ScriptPath+'PVdBDownPage.exe')) Then Begin ShowMessage ('This script needs the external file for work.'+Chr(13)+'• PVdBDownPage.exe'+Chr(13)+'Read script text for futher information',SCRIPT_NAME); Mode:=smFinished; Result:=''; //If error returns empty string exit; End; If (Mode=smSearch) Then Begin //Get stored URL if exist. StoredURL:=GetFieldValueXML('url'); LogMessage('Stored URL is:'+StoredURL+'||'); //Standarize the URL StoredURL:=LowerCase(StoredURL); StoredURL:=StringReplace(StoredURL,'https','http',True,True,False); StoredURL:=StringReplace(StoredURL,' ',BASE_URL_SUF,True,True,False)+BASE_URL_SUF; //Asure that the URLs always finish BASE_URL_SUF (even in the last position //Get KINOPOISK ID if exist. curPos:=Pos(BASE_URL_PRE,StoredURL); If 0<curPos Then Begin //Get IMDB_ID for search LogMessage(' KINOPOISK URL.'); MovieID:=TextBetWeen(StoredURL,BASE_URL_PRE+'film/',BASE_URL_SUF,false,curPos); //WEB_SPECIFIC DownloadURL:=BASE_URL_PRE_TRUE+'film/'+ MovieID +BASE_URL_SUF; //WEB_SPECIFIC LogMessage(' Parse stored information DownloadURL:'+DownloadURL+'||'); Mode:=smNormal; //->Go to function ParsePage for parse the film information Result:=GetAppPath+DUMMY_HTML_FILE; //Any existing little file for cheating PVdB automatic download (little).). LogMessage('Function GetDownloadURL END====================== with Mode='+IntToStr(Mode)+' Result='+Result+'|'); exit; End Else Begin //The movie URL not exist, search mode needed. Download the search page. //ShowMessage('No KINOPOISK URL.',SCRIPT_NAME); LogMessage(' No KINOPOISK URL.'); Mode:=smSearch; //->Go to function ParsePage for search the URL (in this funtion you can't not use user funtions)ntions) DownloadURL:=''; //Has not movie URL. Result:=GetAppPath+DUMMY_HTML_FILE; //Any existing little file for cheating PVdB automatic download (little).). LogMessage('Function GetDownloadURL END====================== with Mode='+IntToStr(Mode)+' Result='+Result+'|'); exit; //Go to the End; End; //Not other modes working needs in this function. //smNormal = 1; //This scripts download with external program (not with GetDownloadURL) so it only make one pass to ParsePage for retrieve all info, credits, poster, etc. other field modes aren't necesarye pass to ParsePage for retrieve all info, credits, poster, etc. other field modes aren't necesary //smSearchList = 8; //Used in ParsePage for demands download the https link returned by user in the window of (AddSearchResult)(AddSearchResult) Result:=GetAppPath+DUMMY_HTML_FILE; //Any existing little file for cheating PVdB automatic download (little). LogMessage('Function GetDownloadURL END====================== with Mode='+IntToStr(Mode)+' Result='+Result+'|'); exit; End; //BlockClose Function GetRatingName:String; //BlockOpen Begin Result:=RATING_NAME; End;//BlockClose Function GetCodePage:Cardinal; //BlockOpen Begin Result:=CODE_PAGE; End; //BlockClose //OBLIGATORY CALLBACK FUNCTIONS=================================================================================BlockClose //USER FUNCTIONS AND PROCEDURES=================================================================================BlockOpen Function DownloadPage(URL:AnsiString):String; //BlockOpen //Returns the URL page text. If error returns empty string Var i:Integer; ScriptPath,WebText:String; Begin LogMessage(Chr(9)+Chr(9)+'Function DownloadPage BEGIN======================|'); LogMessage(Chr(9)+Chr(9)+'Global Var-DownloadURL|'+DownloadURL+'|'); LogMessage(Chr(9)+Chr(9)+' Local Var-URL|'+URL+'|'); ScriptPath:=GetAppPath+'Scripts\'; //LogMessage(Chr(9)+Chr(9)+' Local Var-ScriptPath|'+ScriptPath+'|'); //Delete the ancient dowloaded page file. Needed for wait to curl download included in PowerShell command. While FileExists(ScriptPath+BASE_DOWNLOAD_FILE_NO_BOM) Do Begin FileExecute('cmd.exe', '/C del "'+ScriptPath+BASE_DOWNLOAD_FILE_NO_BOM+'"'); LogMessage(Chr(9)+Chr(9)+' Waiting 1s for delete:'+ScriptPath+BASE_DOWNLOAD_FILE_NO_BOM); wait (1000); End; //Download the URL page. LogMessage(Chr(9)+Chr(9)+' Download with PVdBDownPage in file:|'+ScriptPath+BASE_DOWNLOAD_FILE_NO_BOM+' the information of:|'+URL+'||'); FileExecute(ScriptPath+'PVdBDownPage.exe', '"'+URL+'" "'+ScriptPath+BASE_DOWNLOAD_FILE_NO_BOM+'"'); //Wait download finish and exist the downloaded page. i:=0; // INTERNET_TEST_ITERATIONS While Not(FileExists(ScriptPath+BASE_DOWNLOAD_FILE_NO_BOM)) Do Begin LogMessage(Chr(9)+Chr(9)+' Waiting 2s for exists of:'+ScriptPath+BASE_DOWNLOAD_FILE_NO_BOM); wait (2000); i:=i+1; If i=INTERNET_TEST_ITERATIONS Then Begin if 2=MessageBox('Too many faulty attempts to internet connection.'+Chr(13)+ 'Retry or Cancel?',SCRIPT_NAME,5) then begin LogMessage(Chr(9)+Chr(9)+'Function DownloadPage END with NOT INTERNET connection ===============|'); Result:=''; Exit; End; i:=0; End; End; LogMessage(Chr(9)+Chr(9)+' Now present complete page file: '+ScriptPath+BASE_DOWNLOAD_FILE_NO_BOM); WebText:=FileToString(ScriptPath+BASE_DOWNLOAD_FILE_NO_BOM); WebText:=ConvertEncoding(WebText, 65001); //65001 utf-8 Unicode (UTF-8) ---> https://msdn.microsoft.com/en-us/library/dd317756(VS.85).aspxbrary/dd317756(VS.85).aspx //LogMessage(Chr(9)+Chr(9)+' Local Var-WebText|'+WebText+'|'); //Debug statement Result:=WebText; //Some download data comprobations. if (Pos('Page not found',Result)>0) then begin //Banned IP. WEB_SPECIFIC. If BYPASS_SILENT Then ShowMessage('The URL is not in use (Page not found).'+Chr(13)+'Go to the provider web in order to in order to'+Chr(13)+'find the good page',SCRIPT_NAME); LogMessage(Chr(9)+Chr(9)+' Page not found|'); Result:=''; //Fatal error End; if (Pos('405 Method not allowed',Result)>0) then begin //Banned IP. WEB_SPECIFIC. If BYPASS_SILENT Then ShowMessage('The URL has HTTP method problems (405 Method not allowed).'+Chr(13)+'Go to the provider web in order to in order to'+Chr(13)+'find the good page',SCRIPT_NAME); LogMessage(Chr(9)+Chr(9)+' 405 Method not allowed|'); Result:=''; //Fatal error End; if (Pos('Too many request',Result)>0) then begin //Banned IP. WEB_SPECIFIC. If BYPASS_SILENT Then ShowMessage('The provider has banned your IP (Too many request).'+Chr(13)+'Go to the provider web and resolve the captcha in order to'+Chr(13)+'demostrate you are not a robot',SCRIPT_NAME); LogMessage(Chr(9)+Chr(9)+' Banned IP|'); Result:=''; //Fatal error End; LogMessage(Chr(9)+Chr(9)+'Function DownloadPage END======================|'); exit; End; //BlockClose Function DownloadImage(URL:AnsiString;OutPutFile:AnsiString):Integer; //BlockOpen //Returns 1 or 0 if the downloaded image file exists in Exit. Var i:Integer; ScriptPath:String; Begin LogMessage(Chr(9)+Chr(9)+'Function DownloadImage BEGIN======================|'); LogMessage(Chr(9)+Chr(9)+'Global Var-DownloadURL|'+DownloadURL+'|'); LogMessage(Chr(9)+Chr(9)+' Local Var-URL|'+URL+'|'); LogMessage(Chr(9)+Chr(9)+' Local Var-OutPutFile|'+OutPutFile+'|'); ScriptPath:=GetAppPath+'Scripts\'; //Delete the ancient dowloaded page file. Needed for wait to curl download included in PowerShell command. While FileExists(OutPutFile) Do Begin FileExecute('cmd.exe', '/C del "'+OutPutFile+'"'); LogMessage(Chr(9)+Chr(9)+' Waiting 1s for delete:'+OutPutFile); wait (1000); End; //Download the URL page. LogMessage(Chr(9)+Chr(9)+' Download with PVdBDownPage in file:|'+OutPutFile+' the information of:|'+URL+'||'); FileExecute(ScriptPath+'PVdBDownPage.exe', '"'+URL+'" "'+OutPutFile+'"'); //Wait download finish and exist the downloaded page. i:=0; // INTERNET_TEST_ITERATIONS While Not(FileExists(OutPutFile)) Do Begin LogMessage(Chr(9)+Chr(9)+' Waiting 2s for exists of:'+OutPutFile); wait (2000); i:=i+1; If i=INTERNET_TEST_ITERATIONS Then Begin //In the images download the scritp can not ask to the user for internet conexion because perhaps the file doesn't exist. LogMessage(Chr(9)+Chr(9)+'Function DownloadImage END with NOT file downloaded ===============|'); Result:=0; exit; End; End; LogMessage(Chr(9)+Chr(9)+' Now present complete page file: '+OutPutFile); Result:=1; LogMessage(Chr(9)+Chr(9)+'Function DownloadImage END======================|'); exit; End; //BlockClose Function TextBetWeenFirst(_HTML:string;_ABegin,_AEnd:String):String; //BlockOpen //Returns the first extract part of a given _HTML between _Abegin and _AEnd and removes all tags from the result substring. //In order to avoid set the Pos variable in TextBetween Var _Pos:Integer; Begin _Pos:=0; Result:=TextBetWeen(_HTML,_ABegin,_AEnd,false,_Pos); Exit; End; //BlockClose Function RemoveTagsEx(AText:String):String; //BlockOpen //Ivek23 function for get faster the PLOTKEYWORDS script Var B,E:Integer; Begin Result:=AText; B:=PosFrom(' <div class="did-',Result,18); E:=PosFrom(' </span>',Result,B); While (B>0) AND (B<E) Do Begin Delete(Result,B,E-B+18); B:=Pos(' <div class="did-',Result); E:=Pos(' </span>',Result); End; End; //BlockClose function RandomSet (forw : integer ) : integer; var dt : longint; sta : string ; begin /// строка c списком переменных sta := '-13, 3, 15, 6, 17, 15, 19, -9, -13, 11, 19, 7, -9, 14, -20, -6, -13, 19, -20, 3, 4, 2, -10, 2, -15, 9, -19, 2, -17, 16, -19, -11, 18, 4, -6, -19, 7, 10, 6, -5, 6, 0, 18, 4, 16, 21, -17, 20, -7, -14, -11, -4, 10, -20, -2, -20, -17, -10, 21, 2, 14, 18, -13, 3, -17, -18, 9, 0, 5, -2, -16, -1, 18, -17, -10, -3, 14, 14, -21, 11, 20, -19, 10, -21, -10, -6, -13, -20, 2, 6, -9, 13, 11, -1, 1, 8, -7, 1, 19, -9, 4, -13, -8, 17, -4, -9, 18, 21, 20, 13, -20, -2, 16, 7, -13, 11, -7, 15, 12, -9, 7, -10, 6, 3, -2, 8, -1, -6, -5, 7, 14, -9, 1, 19, 13, -19, -21, -6, -3, -1, 20, 15, -20, 13, -21, 4, 17, -16, -19, -13, -7, -4, 21, -11, 8, -14, -5, 12, 17, -5, 5, 8, 15, 4, 6, -18, 17, -17, -16, -1, 10, 0, -16, 21, -19, -1, -20, 9, 5, -11, 17, 8, 1, -13, -20, 12, 16, -1, 7, 8, 13, -4, -19, -5, -6, -5, -4, -20, 4, -4'; Result:=0; end; function Replace (inStr: String): String; Var I: Integer; Before, After : Array of String; Begin // inStr := HTMLToText (inStr); SetLength (Before, 53); SetLength (After, 53); // Мнемоники Before[ 1] := '„'; After [ 1] := '„'; Before[ 2] := '•'; After [ 2] := '•'; Before[ 3] := '©'; After [ 3] := '©'; Before[ 4] := '°'; After [ 4] := '°'; Before[ 5] := '€'; After [ 5] := '€'; Before[ 6] := '…'; After [ 6] := '…'; Before[ 7] := '«'; After [ 7] := '«'; Before[ 8] := '“'; After [ 8] := '“'; Before[ 9] := '‹'; After [ 9] := '‹'; Before[10] := '‘'; After [10] := '‘'; Before[11] := '—'; After [11] := '—'; Before[12] := '·'; After [12] := '·'; Before[13] := '–'; After [13] := '–'; Before[14] := '±'; After [14] := '±'; Before[15] := '»'; After [15] := '»'; Before[16] := '”'; After [16] := '”'; Before[17] := '®'; After [17] := '®'; Before[18] := '›'; After [18] := '›'; Before[19] := '’'; After [19] := '’'; Before[20] := '‚'; After [20] := '‚'; Before[21] := '§'; After [21] := '§'; Before[22] := '­'; After [22] := ''; // «мягкий» дефис (место возможного переноса) // Коды Before[23] := '‚'; After [23] := '‚'; Before[24] := '„'; After [24] := '„'; Before[25] := '…'; After [25] := '…'; Before[26] := 'ˆ'; After [26] := '€'; Before[27] := '‰'; After [27] := '‰'; Before[28] := '‹'; After [28] := '‹'; Before[30] := '‘'; After [30] := '‘'; Before[31] := '’'; After [31] := '’'; Before[32] := '“'; After [32] := '“'; Before[33] := '”'; After [33] := '”'; Before[34] := '•'; After [34] := '•'; Before[35] := '–'; After [35] := '–'; Before[36] := '—'; After [36] := '—'; Before[37] := '™'; After [37] := '™'; Before[38] := '›'; After [38] := '›'; Before[39] := '«'; After [39] := '«'; Before[40] := '¹'; After [40] := '№'; Before[41] := '»'; After [41] := '»'; // Символы Before[50] := ' '; After [50] := ''; // табуляция Before[51] := #13#10' '; After [51] := #13#10; // пробел в начале абзаца Before[52] := ''; After [52] := ''; // и попадается же хреновина всякая (http://www.kinopoisk.ru/level/1/film/5619/) For I := Low (Before) To High (Before) Do inStr := StringReplace (inStr, Before [i], After [i], true, false, false); Result := HTMLToText (inStr); End; function ReplaceToSimple (inStr: String): String; Var I: Integer; Before, After : Array of String; Begin Result := Replace (inStr); if Not simpleTitle then Exit; SetLength (Before, 19); SetLength (After, 19); Before[ 1] := '·'; After[ 1] := '·'; Before[ 2] := '•'; After[ 2] := '·'; Before[18] := ''''; After[18] := ''''; Before[ 3] := '‚'; After[ 3] := ''''; Before[ 4] := '‘'; After[ 4] := ''''; Before[ 5] := '’'; After[ 5] := ''''; Before[ 5] := '`'; After[ 6] := ''''; Before[17] := '"'; After[17] := ''''; Before[ 7] := '„'; After[ 7] := ''''; Before[ 8] := '“'; After[ 8] := ''''; Before[ 9] := '”'; After[ 9] := ''''; Before[10] := '‹'; After[10] := ''''; Before[11] := '›'; After[11] := ''''; Before[12] := '«'; After[12] := ''''; Before[13] := '»'; After[13] := ''''; Before[14] := '–'; After[14] := '-'; Before[15] := '—'; After[15] := '-'; Before[16] := '…'; After[16] := '...'; For I := Low (Before) To High (Before) Do Result := StringReplace (Result, Before [i], After [i], true, false, false); End; function CheckNum(s: String): String; var st: String; i: integer; begin if pos('€', s) > 0 then delete(s, 1, 7); if pos('¥', s) > 0 then delete(s, 1, 6); for i := 1 to length(s) do if (s[i] >= '0') and (s[i] <= '9') then st := st + s[i]; i := strtoint(st); st := inttostr(i); result := st; end; function CorrectTime ( Tmp : String ) : String ; Var tm, hour, min : Integer; Begin Result := ''; if Tmp = '' then Exit; Tmp := CheckNum (Tmp); tm := StrToInt (Tmp); hour := tm div 60; min := tm mod 60; if hour < 10 then Result := Result + '0'; Result := Result + IntToStr (hour) + ':'; if min < 10 then Result := Result + '0'; Result := Result + IntToStr (min) + ':00'; end; function AllowAddByNumber (const opt, gf : Integer): Boolean; Begin if (gf = 0) then Result := (opt = Enabled) else Result := (opt = Enabled) Or ((opt = Empty) And (GetFieldValue (gf) = '')); End; function AllowAddByName (const opt : Integer; const uf : AnsiString): Boolean; Begin Result := (opt = Enabled) Or ((opt = Empty) And (GetCustomFieldValueByName (uf) = '')); End; function CheckDate(s: String): String; var i, j, num : Integer; months : Array [1..12] of AnsiString; items : TWideArray; Day, Month, Year : String; begin months[ 1] := 'январ'; months[ 2] := 'феврал'; months[ 3] := 'март'; months[ 4] := 'апрел'; months[ 5] := 'ма'; months[ 6] := 'июн'; months[ 7] := 'июл'; months[ 8] := 'август'; months[ 9] := 'сентябр'; months[10] := 'октябр'; months[11] := 'ноябр'; months[12] := 'декабр'; ExplodeString (s, items, ' '); for i := 0 to 2 do begin if i > High (items) then Break; num := StrToInt (items[i]); if num > 0 then begin // День или год if num <= 31 then // День Day := items[i] else if (num >= 1000) And (num <= 2200) then begin // Год Year := items[i]; Break; // Год - последний end; end else begin // Месяц for j := Low (months) to High (months) do if Pos (months[j], LowerCase (items[i])) > 0 then Break; end; if j <= High (months) then Month := IntToStr (j); end; if Year <> '' then begin if Day = '' then Day := '01' else if length (Day) = 1 then Day := '0' + Day; if Month = '' then Month := '01' else if length (Month) = 1 then Month := '0' + Month; Result := Day + '.' + Month + '.' + Year; end else Result := s; end; function CheckDates (s: String): String; var Dates : TWideArray; i : integer; Begin ExplodeString (Replace (s), Dates, ','); Result := ''; for i := low (Dates) to high (Dates) do begin if Result = '' then Result := Result + CheckDate (Dates[i]) else Result := Result + ',' + CheckDate (Dates[i]); end; End; Function ParsePage_BingSearch(HTML:String):Cardinal; //BlockOpen //Returns: // Result:=prDownload; (Global var-DownloadURL=IMDB page) if there is one results. // Result:=prList; if there are several results. (Don't work with Preferences/Plugings/Silent Mode). // Result:=prError; If not results Var curPos,endPos:Integer; ItemValue,ItemList:String; Title,Year,MovieURL:String; Begin LogMessage('Function ParsePage_BingSearch BEGIN======================|'); LogMessage('Global Var-Mode|'+IntToStr(Mode)+'|'); LogMessage('Global Var-DownloadURL|'+DownloadURL+'|'); //First manager the results, second other situation (No results or fail -> Finish) If ((Pos(BASE_URL_PRE, HTML)>0) Or (Pos(BASE_URL_PRE_TRUE, HTML)>0)) Then Begin //Not movie URL found. WEB_SPECIFIC LogMessage(' BASE_URL_PRE results detectes.'); ItemList:=TextBetWeenFirst(HTML,'<ol id="b_results"','</ol>'); //String which opens-closes thesearch List results. WEB_SPECIFIC curPos:=PosFrom('<li class="b_algo">',ItemList,curPos); //String which opens the Web result Movie info (Poster and details text). WEB_SPECIFIC While (0<curPos) Do Begin LogMessage(' Parsing search movie results in '+IntToStr(curPos)+' ...'); //Get PreviewURL (Poster) No preview in Bing search //Get URL. MovieURL:=TextBetWeen(ItemList, StringReplace(BASE_URL_PRE,'http://','',false,true,false),BASE_URL_SUF,false,curPos); //Strings which opens-closes the Web result Movie URL. WEB_SPECIFIC MovieURL:=BASE_URL_PRE_TRUE + MovieURL +BASE_URL_SUF; LogMessage(' Parse Results URL:'+MovieURL+'||'); //If true HTPPS link PVdB gives "Socket Error # 11001" //If ancient http, get redirected and give "IOHandler value is not valid //If invalid url, "HTTP/1.1 400 Bad Request" MovieURL:=CHEAT_PREFIX_URL+MovieURL; //'Cheat' URL for avoid HTTPS issue in GET return. //Get Title and Year and put it in search list result. ItemValue:=TextBetWeen(ItemList,'">','</a>',false,curPos); //String which opens-closes the Web result Movie link. WEB_SPECIFIC //LogMessage(' Parse Results ItemValue:'+ ItemValue+'||'); endPos:=LastPos('(', ItemValue); //Not use curPos for not loosing text position when searching in ItemValue If (0<endPos) Then Begin //No year present not movie so next result. WEB_SPECIFIC //Get Title. Title:=Copy(ItemValue,1,endPos-2); //Strings which opens/closes the data. WEB_SPECIFIC LogMessage(' Parse Results Title:'+Title+'||'); //Get Year. Year:=TextBetWeen(ItemValue,'(',')',false,endPos); //Strings which opens/closes the data. WEB_SPECIFIC LogMessage(' Parse Results in Year:'+Year+'||'); AddSearchResult(Title,'',Year,MovieURL,''); //Just to check the website (Only to check the web page) not PVdB valid result. If CHECK_WEBSITE then AddSearchResult(' '+#8729+' Just to check the website: '+StringReplace(MovieURL,CHEAT_PREFIX_URL,'',True,False,False),'','',StringReplace(MovieURL,CHEAT_PREFIX_URL,'',True,False,False),''); End; curPos:=PosFrom('<li class="b_algo">',ItemList,curPos); //String which opens the Web result HTML file data. WEB_SPECIFIC End; Result:=prList; //Don't work with Preferences/Plugings/Silent Mode. LogMessage(' After parsing Bing search Movies go to choose List Results'); LogMessage('Function ParsePage_BingSearch END=====================||'); Exit; End Else Begin if BYPASS_SILENT then ShowMessage('Not results even with Bing search engine.'+Chr(13)+'Try again or make an advanced search out of the script.'+Chr(13)+'Write the movie URL (http) in the PVdB manually (remember separated by spaces) and run again.',SCRIPT_NAME); Result:=prError; LogMessage(' Not results|'); LogMessage('Function ParsePage_BingSearch END=====================||'); Exit; End; End; //BlockClose Function ParsePage_KINOPOISKSearchTitle(HTML:String):Cardinal; //BlockOpen //Returns: // Result:=prDownload; (Global var DownloadURL=IMDB page) if there is one results. // Result:=prList; if there are several results. (Don't work with Preferences/Plugings/Silent Mode). // Result:=prError; If not results Var endPos,curPos,ResultsNumber,TempStop,stic:Integer; ItemValue,ImageFile:String; Id,Title2,Title,Year,MovieURL,Preview,PreviewURL:String; Begin LogMessage('Function ParsePage_KINOPOISKSearchTitle BEGIN======================|'); LogMessage('Global Var-Mode|'+IntToStr(Mode)+'|'); LogMessage('Global Var-DownloadURL|'+DownloadURL+'|'); If (Pos('No results',HTML)<>0) Then Begin //WEB_SPECIFIC LogMessage(' No Movies results'); Result:=prError; End Else Begin LogMessage(' Parsing search Movies results'); //curPos:=Pos('<div class="search_results search_results_simple',HTML); curPos:=Pos('<div class="search_results',HTML); //String which opens the Web Search List data. WEB_SPECIFIC //Get first item ResultsNumber:=0; //curPos:=PosFrom('<div class="element most_wanted">',HTML,curPos); //String which opens the Web Result List data. WEB_SPECIFIC curPos:=PosFrom('<div class="element',HTML,curPos); //String which opens the Web Result List data. WEB_SPECIFIC While curPos>0 Do Begin ResultsNumber:=ResultsNumber+1; LogMessage(' Parsing search movie results in '+IntToStr(curPos)+' ...'); curPos:=PosFrom('<div class="element',HTML,curPos); //String which opens the Web URL+Title+URL+PreviewURL data. WEB_SPECIFIC //Get Id curPos := PosFrom('spacer.gif"',HTML, curPos); curPos := PosFrom ('title="', HTML, curPos) + 7; endPos := PosFrom ('" alt="', HTML, curPos); Id := Copy (HTML, curPos, endPos - curPos); LogMessage(' Parse Results Id:'+Id+'||'); Id := StringReplace (Id, '.gif', '.jpg', True, False, True); LogMessage(' Parse Results Id1:'+Id+'||'); //Get MovieURL (Always must it has) MovieURL:=TextBetWeen(HTML,'serp-metrika" data-url="/film/','" data-id="',false,curPos); //Strings which opens/closes the data. WEB_SPECIFIC MovieURL:= BASE_URL_PRE+'film/'+MovieURL+BASE_URL_SUF; LogMessage(' Parse Results URL:'+MovieURL+'||'); //If true HTPPS link PVdB gives "Socket Error # 11001" //If ancient http, get redirected and give "IOHandler value is not valid //If invalid url, "HTTP/1.1 400 Bad Request" MovieURL:=CHEAT_PREFIX_URL+MovieURL; //'Cheat' URL for avoid HTTPS issue in GET return. LogMessage(' Parse Results CHEAT URL:'+MovieURL+'||'); //Get Title (Always must it has) endPos :=PosFrom('<p class="name">',HTML,curPos); curPos := PosFrom ('data-type="', HTML, endPos) + 11; endPos := PosFrom ('">', HTML, curPos)+2; curPos := PosFrom ('</a>', HTML, endPos); Title := Copy (HTML, endPos, curPos - endPos); //Title := StringReplace (Title, 'актеры', '', True, False, True); LogMessage(' Parse Results Title:'+Title+'||'); //Get Year TempStop := PosFrom ( '</a></p>' , HTML , endPos); if curPos <> TempStop then begin endPos := curPos; curPos := PosFrom ('"year">', HTML, endPos) + 7; endPos := PosFrom ('</span></p>', HTML, curPos); Year := Copy (HTML, curPos, endPos - curPos); LogMessage(' Parse Results in Year:'+Year+'||'); //Year := StringReplace (Year, ' – ...', '', True, False, True); //LogMessage(' Parse Results in Year1:'+Year+'||'); end; curPos := PosFrom ('<span class="gray">', HTML, endPos) + 19; endPos := PosFrom ('</span>', HTML, curPos); TempStop := PrevPos (', ',HTML,endPos); if TempStop > curPos then endPos := PosFrom (', ',HTML,curPos) else endPos := curPos; Title2 := Copy (HTML, curPos, endPos - curPos); LogMessage(' Parse Results Title2:'+Title2+'||'); //(* // Формируем адрес превью //{ Preview := '://st.kp.yandex.net' + Id ; PreviewURL:=BASE_URL_IMAGE_PRE + Preview; ImageFile:=GetAppPath+'Scripts\'+BASE_DOWNLOAD_FILE_IMAGE_NAME+'-SearchResult-'+IntToStr(ResultsNumber)+'-.jpg'; If (1=DownloadImage(PreviewURL,ImageFile)) then begin //Dowload in the selected user max size. WEB_SPECIFIC LogMessage(' Parse Results PreviewURL:'+PreviewURL +'||'); PreviewURL:=ImageFile; //Pass the downloaded file to PVD end else if (1=DownloadImage(PreviewURL +'.jpg',ImageFile)) then begin //Dowload in the web base size. WEB_SPECIFIC LogMessage(' Parse Results PreviewURL:' + PreviewURL +'||'); PreviewURL:=ImageFile; //Pass the downloaded file to PVD end; //} //*) AddSearchResult(Title,Title2,Year,MovieURL,PreviewURL); //Just to check the website (Only to check the web page) not PVdB valid result. if CHECK_WEBSITE then AddSearchResult(' '+#8729#8729+' Just to check the website: '+StringReplace(MovieURL,CHEAT_PREFIX_URL,'',True,False,False),'','',StringReplace(MovieURL,CHEAT_PREFIX_URL,'',True,False,False),''); curPos:=PosFrom('<div class="element',HTML,curPos) //String which opens the Web Result item List data. WEB_SPECIFIC End; If ResultsNumber=1 Then Begin DownloadURL:=StringReplace(MovieURL,CHEAT_PREFIX_URL,'',True,False,False); //Eliminate the CHEAT_PREFIX_URL for get the true movie link DownloadURL:=StringReplace(DownloadURL,'http:','https:',True,True,False); //The direct url needed (no https redirection) Result:=prDownload; //One result in the DownloadURL. LogMessage(' After parsing search Movies, only one result detected'); End Else Begin Result:=prList; //Don't work with Preferences/Plugings/Silent Mode. LogMessage(' After parsing search Movies go to choose List Results'); End; End; LogMessage('Function ParsePage_KINOPOISKSearchTitle END=====================||'); Exit; End; //BlockClose Function ParsePage_KINOPOISKMovieBASE(HTML:String):Cardinal; //BlockOpen //Returns: // Result:=prFinished; Script has finished gathering data // Result:=prError; If żany big problem? with exit; //Retrieve: ~title~, ~year~, ~origtitle~, ~poster~ / ~imdbrating~, ~IMDB_Votes~ (Custom Field) / ~TOP_250~(Custom Field) / // If Not(GET_FULL_CREDIT): ~crew~ctDirectors,ctWriters,ctComposers,ctProducers(Not in base page), ctActors // ~description~ / ~category~ "keywords" / ~tagline~ / ~genre~ // If Not(GET_FULL_MPAA) ~mpaa~ // ~country~ / ~rdate~ in contry provider local IP geolocation // If Not(GET_FULL_AKA) ~aka~. // ~budget~ / ~money~ / ~studio~ "Production Co" // If Not(GET_FULL_FEATURES) ~features~ Var curPos,endPos,index:Integer; debug_pos1:Integer; ItemValue2,ItemValue1,ItemValue0,ItemValue,ItemList,ImageFile:String; titleValue:String; Name,Role,PersonURL:String; ItemArray:TWideArray; ItemList1,ItemList2,URL,MovieID:String; First, FilmEnd : Integer; Tmp, Tmp2, d : String; Begin LogMessage('Function ParsePage_KINOPOISKMovieBASE BEGIN======================|'); Result:=prFinished; //It will change to prError if any big problem with exit; //Because the script don't retreives the data in the page order a token search for the first curPos position or block select is mandatory //Get ~title~, ~year~, ~origtitle~, ~poster~ //Get all "raw" title summary (in raw because we need the hidden links, we avoid "complete" token in strings which opens/closes) //HTML:=HTMLToText(HTML); ItemList:=TextBetWeenFirst(HTML,'<main class="page-content','/main>'); //WEB_SPECIFIC. //LogMessage(' Get result ItemList:'+ItemList+'||'); If (Length(ItemList)>0) Then Begin //Get ~poster~ ItemValue:=TextBetWeenFirst(ItemList,'<img width="205" src="https://st.kp.yandex.net','" alt="'); //Get poster code. Strings which opens/closes the data. WEB_SPECIFIC if ItemValue <> '' then LogMessage(' Get result poster00:' + ItemValue +'||'); //If ((Length(ItemValue)>0) and Not(USE_SAVED_PVDCONFIG and (Copy(PVDConfigOptions,opPoster,1)='0'))) then begin //The Poster will be saved in PVDthen begin If (Length(ItemList)>0) then begin //The Poster will be saved in PVDthen begin ItemValue:='https://st.kp.yandex.net' + ItemValue; LogMessage(' Get result poster0:' + ItemValue +'||'); //Base poster URL without '.jpg'. WEB_SPECIFIC ItemValue:=StringReplace(ItemValue,'/images/film_iphone/iphone360_','/images/film_big/',True,True,False); ImageFile:=GetAppPath+'Scripts\'+BASE_DOWNLOAD_FILE_IMAGE_NAME+'-Poster.jpg' // Avoid HTTPS redirection: Download https image to file OutPutFile= If (1=DownloadImage(ItemValue,ImageFile)) then begin //Dowload in the selected user max size. WEB_SPECIFIC AddImageURL(itPoster,ImageFile); //Get the photo from a file even if the next line we log the true URL. if ItemValue <> '' then LogMessage(' Get result poster1:'+ItemValue + '||'); end else if (1=DownloadImage(ItemValue +'.jpg',ImageFile)) then begin //Dowload in the web base size. WEB_SPECIFIC AddImageURL(itPoster,ImageFile); //Get the photo from a file even if the next line we log the true URL. if ItemValue <> '' then LogMessage(' Get result poster:' + ItemValue + '.jpg'+'||'); if ImageFile <> '' then LogMessage(' Get result posters:' + ImageFile +'||'); end; End; //Get ~aka~ ItemValue:=TextBetWeenFirst(ItemList,'<span class="alternativeHeadline" itemprop="alternativeHeadline">','</span>'); //Strings which opens/closes the data. WEB_SPECIFIC AddFieldValueXML('aka',ItemValue); if ItemValue <> '' then LogMessage(' Get result aka:'+ItemValue+'||'); //Get ~tagline~ ItemValue0:=TextBetWeenFirst(ItemList,'<meta itemprop="description" content="','" />'); //Strings which opens/closes the data. WEB_SPECIFIC AddFieldValueXML('tagline',ItemValue0); if ItemValue0 <> '' then LogMessage(' Get result tagline:'+ItemValue0+'||'); //Get ~country~ ItemValue0:=TextBetWeenFirst(ItemList,'<div class="movie-info__flag flag flag1" title="','">'); //Strings which opens/closes the data. WEB_SPECIFIC AddFieldValueXML('country',ItemValue0); if ItemValue0 <> '' then LogMessage(' Get results Country:'+ItemValue0+'||'); //Get ~year~ ItemValue:=TextBetWeenFirst(ItemList,'/?quick_filters=films" title="">','</td>'); //Strings which opens/closes the data. WEB_SPECIFIC AddFieldValueXML('year',ItemValue); if ItemValue <> '' then LogMessage(' Get result year:'+ItemValue+'||'); //Get ~genre~ (field with several values in a comma separated list) endPos:=PosFrom('<tr><td class="type">жанр</td><td>',ItemList,curPos); curPos:=PosFrom('<span itemprop="genre">',ItemList,endPos)+23; endPos:=PosFrom('</a></span>,',ItemList,curPos); //ItemValue0:=Copy(ItemList,curPos,endPos-curPos); ItemValue0:=RemoveTags(Copy(ItemList,curPos,endPos-curPos),false); ItemValue:=StringReplace(ItemValue,', <a href="','',True,True,False); ItemValue:=StringReplace(ItemValue,' <a href="','',True,True,False); ItemValue:=StringReplace(ItemValue,'<a href="','',True,True,False); AddFieldValueXML('genre',ItemValue0); if ItemValue0 <> '' then LogMessage(' Get results Genre:'+ItemValue0+'||'); //Get ~mpaa~ Рейтинг MPAA endPos:=PosFrom('<td class="type">рейтинг MPAA</td>',ItemList,curPos); curPos:=PosFrom('.gif" height="11" alt="',ItemList,endPos)+23; endPos:=PosFrom('" border="0" /></a>',ItemList,curPos); //ItemValue1:=Copy(ItemList,curPos,endPos-curPos); ItemValue1:=RemoveTags(Copy(ItemList,curPos,endPos-curPos),false); debug_pos1:=Pos('info-bg"></div>',ItemValue1); If 0<debug_pos1 then ItemValue1:=Copy(ItemValue1,0,debug_pos1-1); if ItemValue1 <> '' then LogMessage(' Get result MPAA1:'+ItemValue1+'||'); AddFieldValueXML('mpaa',ItemValue1); if ItemValue1 <> '' then LogMessage(' Get result MPAA:'+ItemValue1+'||'); //Get the original "Runtime" endPos:=PosFrom('<td class="type">время</td>',ItemList,curPos); curPos:=PosFrom('id="runtime">',ItemList,endPos)+13; endPos:=PosFrom('<span',ItemList,curPos)-6; //ItemValue0:=Copy(ItemList,curPos,endPos-curPos); ItemValue0:=RemoveTags(Copy(ItemList,curPos,endPos-curPos),false); debug_pos1:=Pos(' var robj =',ItemValue0); If 0<debug_pos1 then ItemValue0:=Copy(ItemValue0,0,debug_pos1-1); if ItemValue1 <> '' then LogMessage(' Get result lenght:'+ItemValue0+'||'); AddFieldValueXML('length',IntToStr(60*StrToInt(ItemValue0))); //~length~ Value in seconds. //AddFieldValue(14,TextBetWeenFirst(ItemList,'<meta itemprop="duration" content="','" />')); //Field number 14 = Duration, value in minutes if (Pos('<td class="type">время</td>', ItemList) > 0) then LogMessage(' Get result lenght1:'+TextBetWeenFirst(ItemList,'<meta itemprop="duration" content="','" />')+'||'); //Get ~description~ ItemValue:=TextBetWeenFirst(ItemList,' itemprop="description">', '</div>'); //Strings which opens/closes the data. WEB_SPECIFIC AddFieldValueXML('description',ItemValue); if ItemValue <> '' then LogMessage(' Get result description:'+ItemValue+'||'); //Get ~imdbrating~ ItemValue:=TextBetWeenFirst(ItemList,'IMDb: ',' ('); //Strings which opens/closes the data. WEB_SPECIFIC AddFieldValueXML('imdbrating',ItemValue); AddCustomFieldValueByName('IMDB Rating',ItemValue); AddCustomFieldValueByName('IMDBRating',ItemValue); if ItemValue <> '' then LogMessage(' Get result ratingValue ~imdbrating~ (CF~IMDB Rating~~IMDBRating~):'+ItemValue+'||'); //Get ~kinopoiskrating~ ItemValue:=TextBetWeenFirst(ItemList,'<meta itemprop="ratingValue" content="','" />'); //Strings which opens/closes the data. WEB_SPECIFIC AddFieldValueXML('orname',RATING_NAME); AddFieldValueXML('orating',ItemValue); if ItemValue <> '' then LogMessage(' Get result ratingValue ~kinopoiskrating~:'+ItemValue+'||'); //Get ~kinopoiskrating~ endPos:=PosFrom('http://schema.org/AggregateRating">',ItemList,curPos); curPos:=PosFrom('<meta itemprop="ratingValue" content="',ItemList,endPos)+38; endPos:=PosFrom('" />',ItemList,curPos); ItemValue0:=Copy(ItemList,curPos,endPos-curPos); debug_pos1:=Pos(' <div id="top">',ItemValue0); If 0<debug_pos1 then ItemValue0:=Copy(ItemValue0,0,debug_pos1-1); AddCustomFieldValueByName('Кinopoisk Rating',ItemValue0); if ItemValue0 <> '' then LogMessage(' Get result ratingValue0 ~kinopoiskrating~:'+ItemValue0+'||'); //Get ~kinopoiskvotes~ endPos:=PosFrom('<div class="block_2"> <div class="div1">',ItemList,curPos); curPos:=PosFrom('</span> <span class="ratingCount">',ItemList,endPos)+37; endPos:=PosFrom('</span>',ItemList,curPos); //ItemValue1:=Copy(ItemList, curPos, endPos - curPos); //ItemValue1:=Trim(Copy(ItemList, curPos, endPos - curPos)); ItemValue1:=RemoveTags(Copy(ItemList,curPos,endPos-curPos),false); // ItemValue1:=TextBetWeenFirst(ItemList,'</span> <span class="ratingCount">','</span>'); //Strings which opens/closes the data. WEB_SPECIFIC debug_pos1:=Pos(' <div id="top">',ItemValue1); If 0<debug_pos1 then ItemValue1:=Copy(ItemValue1,0,debug_pos1-1); AddCustomFieldValueByName('КinopoiskVotes',ItemValue1); //AddCustomFieldValueByName('Голоса (Кинопоиск)',ItemValue1); if ItemValue1 <> '' then LogMessage(' Get result ratingCount ~kinopoiskvotes~:'+ItemValue1+'||'); //AddCustomFieldValueByName('Голоса (Кинопоиск)',ItemValue1); //ItemValue:=TextBetWeenFirst(ItemList,'</span> <span class="ratingCount">','</span>'); //Strings which opens/closes the data. WEB_SPECIFIC //if ItemValue <> '' then LogMessage(' Get result ratingCount ~kinopoiskvotes~:'+ItemValue+'||'); ItemValue0:=TextBetWeenFirst(ItemList,'<meta itemprop="ratingCount" content="','" />'); //Strings which opens/closes the data. WEB_SPECIFIC //AddCustomFieldValueByName('Голоса (Кинопоиск)',ItemValue0); if ItemValue0 <> '' then LogMessage(' Get result ratingCount ~kinopoisk votes~:'+ItemValue0+'||'); End; ItemList1:=TextBetWeenFirst(HTML,'<div id="block_rating" itemprop="aggregateRating','/form>'); //WEB_SPECIFIC. //LogMessage(' Get result ItemList1:'+ItemList1+'||'); If (Length(ItemList1)>0) Then Begin //Get ~imdbvotes~ ItemValue1:=TextBetWeenFirst(ItemList1,' (',')</div>'); //Strings which opens/closes the data. WEB_SPECIFIC AddCustomFieldValueByName('Голоса (IMDB)',ItemValue1); AddCustomFieldValueByName('IMDBVotes',ItemValue1); if ItemValue1 <> '' then LogMessage(' Get result ratingCount (~IMDBVotes~):'+ItemValue1+'||'); //Get ~TOP250~ endPos:=PosFrom('>Топ250: ',ItemList1,curPos); curPos:=PosFrom('" class="continue">',ItemList1,endPos)+19; endPos:=PosFrom('<p class="about">',ItemList1,curPos); ItemValue1:=Copy(ItemList1,curPos,endPos-curPos); ItemValue1:=StringReplace(ItemValue1,'</a></span></div>','',True,True,False); ItemValue1:=StringReplace(ItemValue1,' ','',True,True,False); debug_pos1:=Pos('pe="http://schema.org/',ItemValue1); If 0<debug_pos1 then ItemValue1:=Copy(ItemValue1,0,debug_pos1-1); AddCustomFieldValueByName('TOP250',ItemValue1); if ItemValue1 <> '' then LogMessage(' Get result TOP250:'+ItemValue1+'||'); if ItemValue1 <> '' then LogMessage(' Get result ItemList1:'+ItemList1+'||'); End; First := Pos(mcFilmFirst, HTML); FilmEnd := Pos(mcFilmEnd, HTML); // HTML := Copy(HTML, First, FilmEnd-First); First := 1; // Голоса (Kinopoisk) curPos := PosFrom('<span class="rating_ball">', HTML, First); if curPos > 0 then begin ItemValue2 := Replace (TextBetWeenFirst(HTML, '<span class="ratingCount">', '</span>')); //Tmp:= StringReplace(Tmp, ' ', '', true, true, false); if AllowAddByName (optVotesKinopoisk, ufVotesKinopoisk) then AddCustomFieldValueByName(ufVotesKinopoisk, ItemValue2); if ItemValue2 <> '' then LogMessage(' Get result ratingCount ~kinopoisk_votes~:'+ItemValue2+'||'); end; // Бюджет curPos := PosFrom('>бюджет<', HTML, First); if curPos > 0 then begin ItemValue := Replace (TextBetWeenFirst(HTML, '" title="">', '</a>')); //if AllowAddByName (optBudgetU, ufBudget) then AddCustomFieldValueByName(ufBudget, ItemValue); //if AllowAddByNumber (optBudgetU, ufBudget) then AddFieldValueXML('budget', ItemValue); //if AllowAddByNumber (optBudgetM, gfBudget) then AddFieldValueXML('budget', CheckNum(ItemValue)); if ItemValue <> '' then LogMessage(' Get results Budget:'+ItemValue+'||'); end; // Сборы в США curPos := PosFrom('>сборы в США<', HTML, First); if curPos > 0 then begin ItemValue0 := Replace (TextBetWeenFirst(HTML, '" title="">', '</a>')); //if AllowAddByName (optMoneyUSA, ufMoneyUSA) then AddCustomFieldValueByName(ufMoneyUSA, ItemValue0); if ItemValue0 <> '' then LogMessage(' Get results MoneyUSA:'+ItemValue0+'||'); end; // Сборы в России curPos := PosFrom('>сборы в России</td>', HTML, First); if curPos > 0 then begin ItemValue1 := Replace (TextBetWeenFirst(HTML, '" title="">', '</a>')); //if AllowAddByName (optMoneyRUS, ufMoneyRUS) then AddCustomFieldValueByName(ufMoneyRUS, ItemValue1); if ItemValue1 <> '' then LogMessage(' Get results MoneyRUS:'+ItemValue1+'||'); end; // Релиз на DVD curPos := PosFrom('>релиз на DVD<', HTML, First); if curPos > 0 then begin ItemValue := Replace (TextBetWeenFirst(HTML, '<a', '</')); ItemValue := StringReplace (ItemValue, ',...', '', false, false, false) ItemValue1 := CheckDates (ItemValue); ItemValue := StringReplace (ItemValue, ',', ', ', false, false, false); ItemValue1 := StringReplace (ItemValue1, ',', ', ', false, false, false); //if AllowAddByName (optReleaseDVD, ufReleaseDVD) then //if LongDate = true then AddCustomFieldValueByName(ufReleaseDVD, ItemValue) //else AddCustomFieldValueByName(ufReleaseDVD, ItemValue1); if ItemValue1 <> '' then LogMessage(' Get results ReleaseDVD:'+ItemValue1+'||'); end; // Голоса (Kinopoisk) curPos := PosFrom('<span class="rating_ball">', HTML, First); if curPos > 0 then begin Tmp := Replace (TextBetWeenFirst(HTML, '<span class="ratingCount">', '</span>')); //Tmp:= StringReplace(Tmp, ' ', '', true, true, false); //if AllowAddByName (optVotesKinopoisk, ufVotesKinopoisk) then AddCustomFieldValueByName(ufVotesKinopoisk, Tmp); if Tmp <> '' then LogMessage(' Get result ratingCount ~kino-poisk_votes~:'+tmp+'||'); end; // Версия скрипта AddCustomFieldValueByName('Version', SCRIPT_NAME+' - '+SCRIPT_VERSION); //if AllowAddByName (optVersion, 'Version') then AddCustomFieldValueByName('Version', SCRIPT_VERSION); //if AllowAddByName (optVersion, 'Версия скрипта') then AddCustomFieldValueByName('Версия скрипта', SCRIPT_VERSION); if SCRIPT_VERSION <> '' then LogMessage(' Get result SCRIPT_VERSION:'+SCRIPT_VERSION+'||'); LogMessage('Function ParsePage_KINOPOISKMovieBASE END=====================||'); End; //BlockClose (* Function ParsePage_KINOPOISKMovieAWARDS(HTML:String):Cardinal; //BlockOpen //Returns: // Result:=prFinished; Script has finished gathering data // Result:=prError; If żany big problem? with exit; //Retrieve: AddAward(Event, Award, Category, Recipient, Year, Won) Var curPos,endPos,endPosAux,index,curPos1,curPos2,curPos3,curPos4,endPos1,endPos2:Integer; ItemList:String; ItemArray: TWideArray; EventBlock,AwardBlock,EventName,AwardName,AwardCategory,AwardRecipient,EventYear:String; AwardWon: Boolean; Begin LogMessage('Function ParsePage_KINOPOISKMovieAWARDS BEGIN=====================||'); Result:=prFinished; //It will change to prError if any big problem with exit; LogMessage('Function ParsePage_KINOPOISKMovieAWARDS END=====================||'); End; //BlockClose *) //USER FUNCTIONS AND PROCEDURES==================================================================================BlockClose //OBLIGATORY CALLBACK PRINCIPAL FUNCTION=========================================================================BlockOpen Function ParsePage(HTML:String;URL:AnsiString):Cardinal; //BlockOpen Var MovieID,titleValue,yearValue:String; ResultTmp:Cardinal; Date:String; Fullinfo,Movie_URL,IMDB_URL: String; DateParts: TWideArray; Begin LogMessage('Function ParsePage BEGIN======================|'); LogMessage('Global Var-Mode|'+IntToStr(Mode)+'|'); LogMessage('Global Var-DownloadURL|'+DownloadURL+'|'); LogMessage(' Local Var-URL|'+URL+'|'); //Parse return in mode 'Search Movie URL'-------------------------------------------------------------------------------- If (Mode=smSearch) Then Begin titleValue:=GetFieldValueXML('origtitle'); If (Length(titleValue)=0) Then titleValue:=GetFieldValueXML('title'); yearValue:=GetFieldValueXML('year'); If yearValue='0' Then yearValue:=''; // Better no Year (blank) for the searches. LogMessage(' ParsePage smSearch|'+IntToStr(Mode)+'|. Searching DownloadURL for MovieTitle |'+ titleValue+'|'+' MovieYear |'+ yearValue+'|'); //Download Provider search page. DownloadURL:=StringReplace(BASE_URL_SEARCH_PROV,'%s',titleValue,True,True,False); DownloadURL:=StringReplace(DownloadURL,' ','+',True,True,False); //Better list of results without spaces. DownloadURL:=StringReplace(DownloadURL,'%y',yearValue,True,True,False); LogMessage(' Searching in Provider:|' + DownloadURL + '||'); HTML:=DownloadPage(DownloadURL); //True page for parsing the search //HTML:=FileToString( GetAppPath + '\Scripts\kinopoisk[HTTPS].v.1.0.0.0\' + 'V.1.0.0.0-Кinopoisk-[Advanced.Search]-Padrino.htm'); //Debug HTML:=HTMLToText(HTML); Result:=ParsePage_KINOPOISKSearchTitle(HTML); If ((Result=prError) and SEARCH_ENGINE) Then Begin //No results or Redirection -> Search Engine needed LogMessage(' Not results or Redirection in Provider search, try with Bing'); //Download Bing search page. DownloadURL:=StringReplace(BASE_URL_SEARCH_ENGI,'%p',BASE_URL_PRE_TRUE,True,True,False); //WEB_SPECIFIC DownloadURL:=StringReplace(DownloadURL,'%s',titleValue,True,True,False); //WEB_SPECIFIC DownloadURL:=StringReplace(DownloadURL,' ','+',True,True,False); //Better list of results without spaces. WEB_SPECIFIC DownloadURL:=StringReplace(DownloadURL,'%y',yearValue,True,True,False); //WEB_SPECIFIC LogMessage(' Searching in Bing:|' + DownloadURL + '||'); HTML:=DownloadPage(DownloadURL); //True page for parsing the search HTML:=HTMLToText(HTML); Result:=ParsePage_BingSearch(HTML); End; //Parse the returned result of the search list. If Result=prError Then Begin //Not movie found, script finish in error. Mode:=smFinished; LogMessage('Function ParsePage smSearch-prError END======================|'); End; If Result=prList Then Begin //One list of results loaded, needed user choice exit in the script mode (because HTTPS PVD NOT directly will download the user choice). Mode:=smSearchList; LogMessage('Function ParsePage smSearch-prList END======================|'); End; If Result=prDownload Then Begin //One results, exit needed only continue the script. Mode:=smNormal; LogMessage('Function ParsePage smSearch-prDownload END======================|'); End; Exit; End; //Parse return of 'SearchList Movie URL'----------------------------------------------------------------------- If (Mode=smSearchList) Then Begin //The user have choose the link. LogMessage(' ParsePage mode smSearchList. Getting DownloadURL from the return of smSearchList'); DownloadURL:=StringReplace(URL,CHEAT_PREFIX_URL,'',True,False,False); //Eliminate the CHEAT_PREFIX_URL for get the true movie link DownloadURL:=StringReplace(DownloadURL,'http:','https:',True,True,False); //The direct url needed (no https redirection) LogMessage(' Global Var-DownloadURL|'+DownloadURL+'|'); Mode:=smNormal; Result:=prDownload; //But not exit needed for download the page because is HTTPS LogMessage(' With the good movie URL it demand download the movie page'); End; //Parse with the Movie URL 'smNormal'------------------------------------------------------------------------------------ If (Mode=smNormal) Then Begin //Get the script Overwrite Options saved in pvdconf.ini (Remember that PVD only save the options on exit) //0=Do nothing,1=Set if Empty,2=Overwrite PVDConfigOptions:=TextBetWeenFirst(FileToString(GetAppPath+'pvdconf.ini'),'ĘčíîĎîčńę[HTTPS].psf=',Chr(13)); //LogMessage('Stored Script PVDConfigOptions is:'+PVDConfigOptions+'||'); //LogMessage('The Script option of position '+ IntToStr(opPoster) +' is:'+Copy(PVDConfigOptions,opPoster,1)+'||'); Result:=prFinished; //It will change to prError if any big problem with exit; //Information in several page. Needs Provider MovieID MovieID:=TextBetWeenFirst(DownloadURL,BASE_URL_PRE_TRUE+'film/',BASE_URL_SUF); LogMessage(' ParsePage mode smNormal|'+IntToStr(Mode)+'|. Getting provider data for MovieID|'+ MovieID +'|'); //AddCustomFieldValueByName('IMDbID',MovieID); LogMessage(' Get result KINOPOISKID:'+MovieID+'||'); //Get ~url~ if (0=Pos(BASE_URL_PRE,StoredURL)) then begin //Write the url if not exists AddFieldValueXML('url',StringReplace(DownloadURL,BASE_URL_PRE_TRUE,BASE_URL_PRE,True,False,False)); LogMessage(' Get result url:'+StringReplace(DownloadURL,BASE_URL_PRE_TRUE,BASE_URL_PRE,True,False,False)+'||'); end; //Parse principal provider page = BASE_URL_PRE_TRUE------------------------------------------------------------------ HTML:=DownloadPage(DownloadURL); //True page for parsing If (0=Length(HTML)) Then begin //Download error in principal page Result:=prError; Exit; End; HTML:=HTMLToText(HTML); Result:=ParsePage_KINOPOISKMovieBASE(HTML); (* //Parse Awards provider page = BASE_URL_AWARDS----------------------------------------------------------------------- If (GET_FULL_AWARDS and Not(USE_SAVED_PVDCONFIG and (Copy(PVDConfigOptions,opAwards,1)='0'))) Then Begin DownloadURL:=StringReplace(BASE_URL_AWARDS,'%KINOPOISK_ID',MovieID,True,True,False); HTML:=DownloadPage(DownloadURL); //True page for parsing HTML:=HTMLToText(HTML); ResultTmp:=ParsePage_KINOPOISKMovieAWARDS(HTML); If Not(ResultTmp=prFinished) then Result:=ResultTmp; End; *) //Date ~Updated~ (choose simple or verbose version) Date:=DateToStr(CurrentDateTime); //AddFieldValueXML('viewdate',Date); //Only date, don't admit time-. Set Seen value at the same time. //AddFieldValueXML('moddate',Date+' '+TimeToStr(CurrentDateTime)); //Block the dB saving ExplodeString(Date,DateParts,'-'); Date:=DateParts[2]+'.'+ DateParts[1]+'.'+DateParts[0]; Date:=StringReplace(Date,'01.','1.',True,True,False); Date:=StringReplace(Date,'02.','2.',True,True,False); Date:=StringReplace(Date,'03.','3.',True,True,False); Date:=StringReplace(Date,'04.','4.',True,True,False); Date:=StringReplace(Date,'05.','5.',True,True,False); Date:=StringReplace(Date,'06.','6.',True,True,False); Date:=StringReplace(Date,'07.','7.',True,True,False); Date:=StringReplace(Date,'08.','8.',True,True,False); Date:=StringReplace(Date,'09.','9.',True,True,False); //AddCustomFieldValueByName('Updated',Date); // Simple //AddCustomFieldValueByName('Updated',Date+' at '+TimeToStr(CurrentDateTime)); // Verbose AddCustomFieldValueByName('Updated',Date+' at '+TimeToStr(CurrentDateTime)+' • '+SCRIPT_NAME+' '+SCRIPT_VERSION); // Annoying LogMessage(' Provider data info retreived Ok in '+DateToStr(CurrentDateTime)+' '+TimeToStr(CurrentDateTime)+'| (~Updated~)'); Mode:=smFinished; LogMessage('Function ParsePage smNormal END======================|'); Exit; End; //Parse with the Person URL 'smFinished'------------------------------------------------------------------------------------ If (Mode=smFinished) Then Begin //Needed because the PHOTO_DWN_RONDABOUT Mode:=smFinished; LogMessage('Function ParsePage smFinished END======================|'); Result:=prFinished; Exit; End; //Parse with unknow mode----------------------------------------------------------------------------------------------- Result:=prError; Exit; End; //BlockClose //OBLIGATORY CALLBACK PRINCIPAL FUNCTION=========================================================================BlockClose