<?xml version="1.0" encoding="utf-8"?>
<HmsMediaItem>
  <MediaType>3</MediaType>
  <ClassID>51</ClassID>
  <ItemID>6591a5c8-cebd-4e3d-813c-7d4d05b538e0</ItemID>
  <ItemPath>https://ofx.xyz</ItemPath>
  <ParentID>234DF17B-418C-4FDC-9DFE-CD0C586D2E76</ParentID>
  <Properties>
    <Property>
      <ID>4</ID>
      <Value>OFX.xyz</Value>
    </Property>
    <Property>
      <ID>515</ID>
      <Value>1</Value>
    </Property>
    <Property>
      <ID>700</ID>
      <Value>0</Value>
    </Property>
    <Property>
      <ID>701</ID>
      <Value>-1</Value>
    </Property>
    <Property>
      <ID>702</ID>
      <Value>-1</Value>
    </Property>
    <Property>
      <ID>517</ID>
      <Value>578-720,722-1080,482-576,402-480,322-400,202-320,0-200</Value>
    </Property>
    <Property>
      <ID>518</ID>
      <Value>0</Value>
    </Property>
    <Property>
      <ID>512</ID>
      <Value>0</Value>
    </Property>
    <Property>
      <ID>532</ID>
      <Value>1</Value>
    </Property>
    <Property>
      <ID>553</ID>
      <Value>1</Value>
    </Property>
    <Property>
      <ID>522</ID>
      <Value>0</Value>
    </Property>
    <Property>
      <ID>570</ID>
      <Value>1</Value>
    </Property>
    <Property>
      <ID>245</ID>
      <Value>6591a5c8-cebd-4e3d-813c-7d4d05b538e0</Value>
    </Property>
    <Property>
      <ID>93</ID>
      <Value>42918,5251253704</Value>
    </Property>
    <Property>
      <ID>50</ID>
      <Value>Фильмы (основной)_480x270</Value>
    </Property>
    <Property>
      <ID>527</ID>
      <Value>--addinfoitems--quality=high--pages=10</Value>
    </Property>
    <Property>
      <ID>530</ID>
      <Value>string    gsUrlBase    = &apos;https://ofx.xyz&apos;; // База для относительных ссылок
int       gnTotalItems = 0;                 // Счётчик созданных элементов
TDateTime gStart       = Now;               // Время начала запуска скрипта
int gnMaxPages=10, gnMaxInGroup=100; bool gbYearInTitle=false; char gsGroupMode=&apos;&apos;;

// Регулярные выражения для поиска на странице блоков с информацией о видео
string
  gsPatternBlock  = &apos;"pic relative"(.*?)&lt;/span&gt;&apos;             , // Искомые блоки
  gsCutPage       = &apos;&lt;fromCut&gt;(.*?)&lt;toCut&gt;&apos;                  , // Обрезка загруженной страницы
  gsPatternTitle  = &apos;title="(.*?)"&apos;                          , // Название
  gsPatternLink   = &apos;&lt;a href="(.*?)"&apos;                        , // Ссылка
  gsPatternImg    = &apos;&lt;img src="(.*?)"&apos;                       , // Картинка
  gsPatternYear   = &apos;shortinfo.*?&gt;(\\d{4})&lt;&apos;                 , // Год
  gsPatternAudio  = &apos;&lt;li data-moonwalk="" id="0"&gt;(.*?)&lt;/li&gt;&apos; , // Озвучка / Перевод
  gsPatternPages  = &apos;.*/page/\\d+/"&gt;(\\d+)&apos;                  , // Регулярное выражение для поиска максимального номера страницы для дозагрузки
  gsPagesParams   = &apos;page/&lt;PN&gt;/&apos;                             , // Параметр с номером страницы, который добавляется к ссылке
  ;

///////////////////////////////////////////////////////////////////////////////
// Создание папки или подкаста
THmsScriptMediaItem CreateFolder(THmsScriptMediaItem ParentFolder, string sName, string sLink, string sImg=&apos;&apos;) {
  THmsScriptMediaItem Item = ParentFolder.AddFolder(sLink); // Создаём папку с указанной ссылкой
  Item[mpiTitle     ] = sName; // Присваиваем наименование
  Item[mpiThumbnail ] = sImg;  // Картинка
  Item[mpiCreateDate] = DateTimeToStr(IncTime(gStart, 0, -gnTotalItems, 0, 0)); // Для обратной сортировки по дате создания

  gnTotalItems++;             // Увеличиваем счетчик созданных элементов
  return Item;                // Возвращаем созданный объект
}

///////////////////////////////////////////////////////////////////////////////
// Получение имени группировки по имени видео (первая буква, "A..Z" или "#")
string GetGroupName(string sName) {
  string sGrp = &apos;#&apos;;
  if (HmsRegExMatch(&apos;([A-ZА-Я0-9])&apos;, sName, sGrp, 1, PCRE_CASELESS)) sGrp = UpperCase(sGrp);
  if (HmsRegExMatch(&apos;[A-Z]&apos;, sGrp, sGrp)) sGrp = &apos;A..Z&apos;;
  if (HmsRegExMatch(&apos;[0-9]&apos;, sGrp, sGrp)) sGrp = &apos;#&apos;;
  return sGrp;
}

///////////////////////////////////////////////////////////////////////////////
// Загрузка страниц и парсинг 
void LoadAndParse() {
  string sHtml, sData, sName, sLink, sImg, sYear, sPage, sVal, sPost, sServ; // Объявляем переменные
  THmsScriptMediaItem Item, Folder = FolderItem; TRegExpr RegEx;
  int i, n, nPages=0, iCnt=0, nGrp=0; char sGrp=""; bool bGroup=false;

  if (HmsRegExMatch(&apos;--maxingroup=(\\d+)&apos;, mpPodcastParameters, sVal)) gnMaxInGroup = StrToInt(sVal);
  if (HmsRegExMatch(&apos;--maxpages=(\\d+)&apos;  , mpPodcastParameters, sVal)) gnMaxPages   = StrToInt(sVal);
  HmsRegExMatch(&apos;--group=(\\w+)&apos;, mpPodcastParameters, gsGroupMode);
  gbYearInTitle = (Pos(&apos;--yearintitle&apos;, mpPodcastParameters)&gt;0); 

  if (LeftCopy(mpFilePath, 4) != "http") {
    // Если нет ссылки - делаем поиск названия
    if (Length(mpTitle)&lt;4) mpTitle += " :::";    // Фишка обхода ограничения на минимальную длину в 4 символа (двоеточие при самом поиске не учитывается)
      HmsRegExMatch(&apos;//(.*)&apos;, gsUrlBase, sServ); // получаем доменное имя из gsUrlBase в sServ
    sPost = &apos;search_text=&apos;+HmsHttpEncode(mpTitle);
    sHtml = HmsSendRequestEx(sServ, &apos;/search&apos;, &apos;POST&apos;,
    &apos;application/x-www-form-urlencoded; Charset=UTF-8&apos;, 
    gsUrlBase+&apos;/\r\nAccept-Encoding: gzip, deflate\r\nOrigin: &apos;+gsUrlBase, 
    sPost, 80, 0, &apos;&apos;, true);
    gnMaxPages = 1;
    
  } else {
    // Иначе просто, загружаем страницу по ссылке
    sHtml = HmsDownloadURL(mpFilePath, &apos;Referer: &apos;+gsUrlBase, true);
    
  }
  sHtml = HmsUtf8Decode(sHtml);       // Декодируем страницу из UTF-8
  sHtml = HmsRemoveLineBreaks(sHtml); // Удаляем переносы строк, для облегчения работы с регулярными выражениями

  // Если указан шаблон поиска максимального номера страницы - применяем
  if ((gsPatternPages!=&apos;&apos;) &amp;&amp; HmsRegExMatch(gsPatternPages, sHtml, sVal)) nPages = StrToIntDef(sVal, 0);

  // Вырезаем только нужный участок текста HTML, где будем искать блоки.
  // Вместо &lt;fromCut&gt; и &lt;toCut&gt; вставляем начало и конец участка HTML, между которыми
  // будем искать блоки текста с сылкой, наименованием и проч.
  HmsRegExMatch(gsCutPage, sHtml, sHtml); // ищем в sHtml, результат кладём обратно в sHtml

  // =========================================================================
  // Дозагрузка страниц
  if ((gnMaxPages!=0) &amp;&amp; (nPages&gt;gnMaxPages)) nPages = gnMaxPages;
  for (i=2; i&lt;=nPages; i++) {
    HmsSetProgress(Trunc(i*100/nPages));
    HmsShowProgress(Format(&apos;%s: Загрузка страницы %d из %d&apos;, [mpTitle, i, nPages]));
    sLink = mpFilePath + ReplaceStr(gsPagesParams, &apos;&lt;PN&gt;&apos;, IntToStr(i));
    sPage = HmsDownloadURL(sLink, &apos;Referer: &apos;+gsUrlBase, true);
    sPage = HmsUtf8Decode(sPage);
    if (gsCutPage!=&apos;&apos;) HmsRegExMatch(gsCutPage, sPage, sPage);
    sHtml += sPage;
    if (HmsCancelPressed) break;
  }
  HmsHideProgress();                                                                                                   
  // =========================================================================
      
  // Создаём объект для поиска блоков текста по регулярному выражению,
  // в которых есть информация: ссылка, наименование, ссылка на картинку и проч.
  // Обычно, определяем начало и конец блока и вставляем их вместо &lt;section&gt; и &lt;/section&gt;
  RegEx = TRegExpr.Create(gsPatternBlock, PCRE_SINGLELINE);
  try {
    // Определяем, если блоков в загруженном более чем gnMaxInGroup, включаем группировку
    i=0; if (RegEx.Search(sHtml)) do i++; while (RegEx.SearchAgain());
    bGroup = (i &gt; gnMaxInGroup);
    // Главный цикл поиска блоков
    if (RegEx.Search(sHtml)) do {
      sLink=&apos;&apos;; sImg=&apos;&apos;; sYear=&apos;&apos;; sName=&apos;&apos;;
      HmsRegExMatch(gsPatternTitle, RegEx.Match, sName);
      HmsRegExMatch(gsPatternLink , RegEx.Match, sLink);
      HmsRegExMatch(gsPatternImg  , RegEx.Match, sImg );
      HmsRegExMatch(gsPatternYear , RegEx.Match, sYear);
      if (Trim(sLink)=="") continue;
    
      sName = ReplaceStr(HmsHtmlToText(sName), "/", "-");
      sLink = HmsExpandLink(sLink, gsUrlBase);

      if (sImg!=&apos;&apos;) sImg = HmsExpandLink(sImg, gsUrlBase);

      // Если в ссылках встречаются русские символы - делаем их безопасными
      if (HmsRegExMatch(&apos;^.*?([а-яА-Я].*)&apos;, sImg, sVal)) sImg = ReplaceStr(sImg, sVal, HmsPercentEncode(HmsUtf8Encode(sVal)));

      // Если указано добавлять год вназвание и в названии его нет, добавляем
      if (gbYearInTitle &amp;&amp; (sYear!=&apos;&apos;) &amp;&amp; (Pos(sYear, sName)&lt;1)) sName += &apos; (&apos;+sYear+&apos;)&apos;;

      // Контроль группировки (создаём папку с именем группы)
      if (gsGroupMode==&apos;alph&apos;) {
        Folder = FolderItem.AddFolder(GetGroupName(sName)); 
        Folder[mpiFolderSortOrder] = "mpTitle";
      } else if (gsGroupMode==&apos;year&apos;) {
        Folder = FolderItem.AddFolder(sYear); 
        Folder[mpiFolderSortOrder] = "mpTitle";
        Folder[mpiYear           ] = sYear;
      } else if (bGroup) {
        iCnt++; if (iCnt&gt;=gnMaxInGroup) { nGrp++; iCnt=0; }
        Folder = FolderItem.AddFolder(Format(&apos;%.2d&apos;, [nGrp])); 
      }

      CreateFolder(Folder, sName, sLink, sImg); // Создание ссылки (папки с фильмом)

    } while (RegEx.SearchAgain);
  } finally { RegEx.Free(); }
  if      (gsGroupMode==&apos;alph&apos;) FolderItem.Sort(&apos;mpTitle&apos;);
  else if (gsGroupMode==&apos;year&apos;) FolderItem.Sort(&apos;-mpYear&apos;);

  HmsLogMessage(1, mpTitle+&apos;: создано элементов - &apos;+IntToStr(gnTotalItems));
}

///////////////////////////////////////////////////////////////////////////////
//                    Г Л А В Н А Я    П Р О Ц Е Д У Р А                     //
{
  FolderItem.DeleteChildItems(); // Удаляем созданные ранее элементы в текущей папке
  LoadAndParse();                // Запускаем загрузку страниц и создание папок видео
}
</Value>
    </Property>
    <Property>
      <ID>531</ID>
      <Value>C++Script</Value>
    </Property>
    <Property>
      <ID>550</ID>
      <Value>string    gsUrlBase    = "https://ofx.xyz"; // База для относительных ссылок
int       mpiVideoMessage = 1001001;
string    gsPodcastName   = "ofx.xyz";
string    gsPreviewPrefix = &apos;ofx&apos;; // Префикс кеша информационных картинок на сервере wonky.lostcut.net
int       gnTotalItems = 0; TDateTime gTimeStart = Now; bool gbQualityLog = false; // Счётчик созданных элементов
TDateTime gStart       = Now;                // Время начала запуска скрипта
string    gsTime       = "01:40:00.000";     // Продолжительность видео
int       mpiCountry   = 10012;              // Идентификаторы для хранения дополнительной
int       mpiTranslate = 10013;              // информации в свойствах подкаста
int       mpiQuality   = 10014;
bool      gbUseSerialKPInfo = false;
string    gsTVDBInfo   = "";
string    gsHeaders    = gsUrlBase+&apos;/\r\n&apos;+
                         &apos;Accept-Encoding: gzip, deflate\r\n&apos;+
                         &apos;User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko/20100101 Firefox/13.0\r\n&apos;;

///////////////////////////////////////////////////////////////////////////////
// Формирование ссылки для воспроизведения через HDSDump.exe
void HDSLink(string sLink, string sQual = &apos;&apos;) {
  string sData, sExePath, sVal;
  sExePath = ProgramPath+&apos;\\Transcoders\\hdsdump.exe&apos;;
  MediaResourceLink = Format(&apos;cmd://"%s" --manifest "%s" --outfile "&lt;OUTPUT FILE&gt;"&apos;, [sExePath, sLink]);
  if (sQual       != &apos;&apos;) MediaResourceLink += &apos; --quality &apos; + sQual;
  if (mpTimeStart != &apos;&apos;) MediaResourceLink += &apos; --skip &apos;    + mpTimeStart;
  PodcastItem[mpiTimeSeekDisabled] = true;
  // Получение длительности видео, если она не установлена
  if ((Trim(PodcastItem[mpiTimeLength])==&apos;&apos;) || (RightCopy(PodcastItem[mpiTimeLength], 6)==&apos;00.000&apos;)) {
    sData = HmsDownloadUrl(sLink, &apos;Referer: &apos;+sLink, true);
    if (HmsRegExMatch(&apos;&lt;duration&gt;(\\d+)&apos;, sData, sVal))
      PodcastItem.Properties[mpiTimeLength] = StrToInt(sVal);
  }
}

///////////////////////////////////////////////////////////////////////////////
// Получение ссылки с moonwalk.cc
void GetLink_Moonwalk(string sLink) {
  string sHtml, sData, sPage, sPost, sVer, sQual, sVal, sServ, sRet, sVar;
  int i; float f; TRegExpr RE; bool bHdsDump, bQualLog;
  
  string sHeaders = sLink+&apos;\r\n&apos;+
                    &apos;Accept-Encoding: identity\r\n&apos;+
                    &apos;User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko/20100101 Firefox/13.0\r\n&apos;;
  
  // Проверка установленных дополнительных параметров
  HmsRegExMatch(&apos;--quality=(\\w+)&apos;, mpPodcastParameters, sQual);
  bHdsDump = Pos(&apos;--hdsdump&apos;      , mpPodcastParameters) &gt; 0;
  bQualLog = Pos(&apos;--qualitylog&apos;   , mpPodcastParameters) &gt; 0;
  
  sLink = ReplaceStr(sLink, &apos;moonwalk.co&apos;, &apos;moonwalk.cc&apos;);
  sLink = ReplaceStr(sLink, &apos;moonwalk.pw&apos;, &apos;moonwalk.cc&apos;);
  HmsRegExMatch2(&apos;//(.*?)(/.*)&apos;, sLink, sServ, sPage);
  sHtml = HmsSendRequestEx(sServ, sPage, &apos;GET&apos;, &apos;application/x-www-form-urlencoded; Charset=UTF-8&apos;, sHeaders, &apos;&apos;, 80, 0, sRet, true);
  if (HmsRegExMatch(&apos;&lt;iframe[^&gt;]+src="(http.*?)"&apos;, sHtml, sLink)) {
    sLink = ReplaceStr(sLink, &apos;moonwalk.co&apos;, &apos;moonwalk.cc&apos;);
    sLink = ReplaceStr(sLink, &apos;moonwalk.pw&apos;, &apos;moonwalk.cc&apos;);
    HmsRegExMatch2(&apos;//(.*?)(/.*)&apos;, sLink, sServ, sPage);
    sHtml = HmsSendRequestEx(sServ, sPage, &apos;GET&apos;, &apos;application/x-www-form-urlencoded; Charset=UTF-8&apos;, sHeaders, &apos;&apos;, 80, 0, sRet, true);
  }
  if (HmsRegExMatch(&apos;"csrf-token"\\s+content="(.*?)"&apos;, sHtml, sVal)) sHeaders += &apos;X-CSRF-Token:&apos;+sVal+&apos;\r\n&apos;;
  if (!HmsRegExMatch(&apos;(https?://.*?)/&apos;, sLink, sVal)) sVal = &apos;http://moonwalk.cc&apos;;
  sHeaders += &apos;Origin: &apos;+sVal+&apos;\r\n&apos;+
              &apos;X-Requested-With: XMLHttpRequest\r\n&apos;;
  
  if (!HmsRegExMatch(&apos;src="(.*?)"&apos;, sHtml, sPage)) {
    HmsLogMessage(2, mpTitle+&apos;: Не найдена ссылка на параметры в iframe.&apos;);
    return;
  }
  
  HmsRegExMatch(&apos;(.*?//.*?)/&apos;, sLink, sServ);
  sPage = HmsExpandLink(sPage, sServ);
  sData = HmsDownloadURL(sPage, &apos;Referer: &apos;+sLink);
  
  // Поиск дополнительных HTTP заголовков, которые нужно установить
  HmsRegExMatch(&apos;url:"(/manifests.*?)"&apos;, sData, sPage);
  HmsRegExMatch("video_token\\s*:\\s*&apos;(.*?)&apos;", sHtml, sVal);
  sPage += sVal + &apos;/all&apos;;
  HmsRegExMatch("user_token\\s*:\\s*&apos;(.*?)&apos;", sHtml, sVal);
  sHeaders += &apos;X-Access-Level: &apos;+sVal+&apos;\r\n&apos;;
  
  if (!HmsRegExMatch(&apos;var e=\\{(mw_key.*?)\\}&apos;, sData, sData)) {
    HmsLogMessage(2, mpTitle+&apos;: Не найдены параметры для POST запроса.&apos;);
    return;
  }
  
  sPost = sData;
  sPost = ReplaceStr(sPost, &apos;:&apos;, &apos;=&apos;);
  sPost = ReplaceStr(sPost, &apos; &apos;, &apos;&apos; );
  sPost = ReplaceStr(sPost, "&apos;", &apos;&apos; );
  sPost = ReplaceStr(sPost, &apos;"&apos;, &apos;&apos; );
  sPost = ReplaceStr(sPost, &apos;this.options.&apos;, &apos;&apos;);
  sPost = ReplaceStr(sPost, &apos;,&apos;, &apos;&amp;&apos;);
  // Замена имён переменных их значениями в параметрах запроса
  sData = sPost;
  while(HmsRegExMatch2(&apos;.(=(\\w+).*)&apos;, sData, sData, sVar)) {
    if (HmsRegExMatch(&apos;\\b&apos;+sVar+&apos;\\s*:\\s*(.*?),&apos;, sHtml, sVal))
      sPost = ReplaceStr(sPost, &apos;=&apos;+sVar, &apos;=&apos;+sVal);
  }
  
  HmsRegExMatch(&apos;//(.*?)/&apos;, sLink, sServ);
  sData = HmsSendRequest(sServ, sPage, &apos;POST&apos;, &apos;application/x-www-form-urlencoded; Charset=UTF-8&apos;, sHeaders, sPost, 80, true);
  sData = ReplaceStr(HmsJsonDecode(sData), "\\r\\n", "");
  
  if (bHdsDump &amp;&amp; HmsRegExMatch(&apos;"manifest_f4m"\\s*?:\\s*?"(.*?)"&apos;, sData, sLink)) {
    
    HDSLink(sLink, sQual);
    
  } else if (HmsRegExMatch(&apos;"manifest_m3u8"\\s*?:\\s*?"(.*?)"&apos;, sData, sLink)) {
    MediaResourceLink = &apos; &apos; + sLink;
    // Получение длительности видео, если она не установлена
    // ------------------------------------------------------------------------
    sData = HmsDownloadUrl(sLink, &apos;Referer: &apos;+sHeaders, true);
    sVal  = Trim(PodcastItem.ItemOrigin[mpiTimeLength]);
    if ((sVal==&apos;&apos;) || (RightCopy(sVal, 6)==&apos;00.000&apos;)) {
      if (HmsRegExMatch(&apos;(http.*?)[\r\n$]&apos;, sData, sLink)) {
        sHtml = HmsDownloadUrl(sLink, &apos;Referer: &apos;+sHeaders, true);
        RE = TRegExpr.Create(&apos;#EXTINF:(\\d+.\\d+)&apos;, PCRE_SINGLELINE); f=0;
        if (RE.Search(sHtml)) do f += StrToFloatDef(RE.Match(1), 0); while (RE.SearchAgain());
        RE.Free;
        if (f &gt; 0) PodcastItem.ItemOrigin[mpiTimeLength] = HmsTimeFormat(Round(f))+&apos;.000&apos;;
      }
    }
    // ------------------------------------------------------------------------
    
    // Если установлен ключ --quality или в настройках подкаста выставлен приоритет выбора качества
    // ------------------------------------------------------------------------
    string sSelectedQual = &apos;&apos;, sMsg, sHeight; int iMinPriority = 99, iPriority; 
    if ((sQual!=&apos;&apos;) || (mpPodcastMediaFormats!=&apos;&apos;)) {
      TStringList QLIST = TStringList.Create();
      // Собираем список ссылок разного качества
      RE = TRegExpr.Create(&apos;#EXT-X-STREAM-INF:RESOLUTION=\\d+x(\\d+).*?[\r\n](http.+)$&apos;, PCRE_MULTILINE);
      if (RE.Search(sData)) do {
        sHeight = Format(&apos;%.5d&apos;, [StrToInt(RE.Match(1))]);
        sLink   = RE.Match(2);
        QLIST.Values[sHeight] = sLink;
        iPriority = HmsMediaFormatPriority(StrToInt(sHeight), mpPodcastMediaFormats);
        if ((iPriority &gt;= 0) &amp;&amp; (iPriority &lt; iMinPriority)) {
          iMinPriority  = iPriority;
          sSelectedQual = sHeight;
        }
      } while (RE.SearchAgain());
      RE.Free;
      QLIST.Sort();
      if (QLIST.Count &gt; 0) {
        if      (sQual==&apos;low&apos;   ) sSelectedQual = QLIST.Names[0];
        else if (sQual==&apos;medium&apos;) sSelectedQual = QLIST.Names[Round((QLIST.Count-1) / 2)];
        else if (sQual==&apos;high&apos;  ) sSelectedQual = QLIST.Names[QLIST.Count - 1];
        else if (HmsRegExMatch(&apos;(\\d+)&apos;, sQual, sQual)) {
          extended minDiff = 999999; // search nearest quality
          for (i=0; i &lt; QLIST.Count; i++) {
            extended diff = StrToInt(QLIST.Names[i]) - StrToInt(sQual);
            if (Abs(diff) &lt; minDiff) {
              minDiff = Abs(diff);
              sSelectedQual = QLIST.Names[i];
            }
          }
        }
      }
      if (sSelectedQual != &apos;&apos;) MediaResourceLink = &apos; &apos; + QLIST.Values[sSelectedQual];
      if (bQualLog) {
        sMsg = &apos;Доступное качество: &apos;;
        for (i = 0; i &lt; QLIST.Count; i++) {
          if (i&gt;0) sMsg += &apos;, &apos;;
          sMsg += IntToStr(StrToInt(QLIST.Names[i])); // Обрезаем лидирующие нули
        }
        if (sSelectedQual != &apos;&apos;) sSelectedQual = IntToStr(StrToInt(sSelectedQual));
        else sSelectedQual = &apos;Auto&apos;;
        sMsg += &apos;. Выбрано: &apos; + sSelectedQual;
        HmsLogMessage(1, mpTitle+&apos;. &apos;+sMsg);
      }
      QLIST.Free;
    }
    // ------------------------------------------------------------------------
    
  } else if (HmsRegExMatch(&apos;"manifest_mp4"\\s*?:\\s*?"(.*?)"&apos;, sData, sLink)) {
    sData = HmsDownloadURL(sLink, &apos;Referer: &apos;+sHeaders);
    // Поддержка установленных приоритетов качества в настройках подкаста
    TJsonObject JSON = TJsonObject.Create();
    int height, selHeight=0, minPriority=99, priority, maxHeight;
    if (sQual==&apos;medium&apos;) sQual=&apos;480&apos;; if (sQual==&apos;low&apos;) sQual=&apos;360&apos;;
    maxHeight = StrToIntDef(sQual, 4320);
    try {
      JSON.LoadFromString(sData);
      for (i=0; i&lt;JSON.Count; i++) {
        sVer  = JSON.Names[i];
        sLink = JSON.S[sVer];
        height = StrToIntDef(sVer, 0);
        if ((sQual!=&apos;&apos;) &amp;&amp; (sQual==sVer)) { MediaResourceLink = sLink; selHeight = height; break; }
        if (mpPodcastMediaFormats!=&apos;&apos;) {
          priority = HmsMediaFormatPriority(height, mpPodcastMediaFormats);
          if ((priority&gt;=0) &amp;&amp; (priority&lt;minPriority)) {
            MediaResourceLink = sLink; minPriority = priority;
          }
        } else if ((height &gt; selHeight) &amp;&amp; (height &lt;= maxHeight)) {
          MediaResourceLink = sLink; selHeight = height;
        }
      }
    } finally { JSON.Free(); }
    
  } else {
    HmsLogMessage(2, mpTitle+&apos;: Ошибка получения данных от new_session.&apos;);
    //if (DEBUG==1) {
    if (ServiceMode) sVal = SpecialFolderPath(0x37); // Общая папака "Видео"
      else           sVal = SpecialFolderPath(0);    // Рабочий стол
      sVal = IncludeTrailingBackslash(sVal)+&apos;Moonwalk.log&apos;;
    HmsStringToFile(sHeaders+&apos;\r\nsHtml:\r\n&apos;+sHtml+&apos;\r\nsPost:\r\n&apos;+sPost+&apos;\r\nsData:\r\n&apos;+sData, sVal);
    HmsLogMessage(1, mpTitle+&apos;: Создан лог файл &apos;+sVal);
  }
}
//} // Конец функции поулчения ссылки с moonwalk.cc

///////////////////////////////////////////////////////////////////////////////
// Создание информационной ссылки
void CreateInfoItem(string sName, string sVal) {
  THmsScriptMediaItem Item; sVal = Trim(sVal);
  if (sVal=="") return;
  Item = HmsCreateMediaItem(&apos;Info&apos;+IntToStr(PodcastItem.ChildCount), PodcastItem.ItemID);
  Item[mpiTitle     ] = sName+&apos;: &apos;+sVal;
  Item[mpiThumbnail ] = &apos;http://wonky.lostcut.net/vids/info.jpg&apos;;
  Item[mpiTimeLength] = 9;
  Item[mpiCreateDate] = VarToStr(IncTime(gStart,0,-gnTotalItems,0,0));
  gnTotalItems++;
}

///////////////////////////////////////////////////////////////////////////////
// Создание ссылки-ошибки
void CreateErrorItem(string sMsg) {
  THmsScriptMediaItem Item = HmsCreateMediaItem(&apos;http://wonky.lostcut.net/vids/podcasterror_hd.mp4&apos;, PodcastItem.ItemID);
  Item[mpiTitle     ] = sMsg;
  Item[mpiThumbnail ] = &apos;http://wonky.lostcut.net/icons/symbol-error.png&apos;;
}

///////////////////////////////////////////////////////////////////////////////
// Создание ссылки на видео
THmsScriptMediaItem CreateMediaItem(THmsScriptMediaItem Folder, string sTitle, string sLink=&apos;&apos;, string sGrp=&apos;&apos;) {
  THmsScriptMediaItem Item = HmsCreateMediaItem(sLink, Folder.ItemID, sGrp);
  Item[mpiTitle     ] = sTitle;
  Item[mpiCreateDate] = VarToStr(IncTime(gStart,0,-gnTotalItems,0,0));
  Item[mpiTimeLength] = gsTime;
  Item.CopyProperties(PodcastItem, [mpiThumbnail,mpiYear,mpiActor,mpiDirector,mpiProducer,mpiGenre]);
  gnTotalItems++;
  return Item;
}

///////////////////////////////////////////////////////////////////////////////
// Создание папки подкаста
THmsScriptMediaItem CreateFolder(THmsScriptMediaItem ParentFolder, string sName, string sLink, string sImg=&apos;&apos;) {
  if (sImg==&apos;&apos;) sImg = mpThumbnail;
  THmsScriptMediaItem Item = ParentFolder.AddFolder(sLink); // Создаём папку с указанной ссылкой
  Item[mpiTitle     ] = sName; // Присваиваем наименование
  Item[mpiThumbnail ] = sImg;  // Картинка
  Item[mpiCreateDate] = DateTimeToStr(IncTime(gStart, 0, -gnTotalItems, 0, 0)); // Для обратной сортировки по дате создания
  gnTotalItems++;             // Увеличиваем счетчик созданных элементов
  return Item;                // Возвращаем созданный объект
}

// -------------------------------------------- Получение ссылки на vk.com ----
bool GetLink_VK2(char sLink) {
  char sHtml, sVal, host, uid, vkid, vtag, max_hd, no_flv, res;
  char ResolutionList=&apos;0:240, 1:360, 2:480, 3:720&apos;, sQAval, sQSel;
  int i, iPriority=0, iMinPriority=99; int nFlag=0; 
  string sRet=&apos;&apos;, sPost=&apos;&apos;, sOid, sID, sLnk2=&apos;&apos;;
  
  sHtml = HmsDownloadUrl(sLink, &apos;Referer: &apos;+gsHeaders, true);    
  sHtml = ReplaceStr(sHtml, &apos;\\&apos;, &apos;&apos;);
  host = &apos;&apos;; max_hd = &apos;2&apos;;
  
  if (!HmsRegExMatch(&apos;vtag["\&apos;:=\\s]+([0-9a-z]+)&apos;, sHtml, vtag)) {
    if (HmsRegExMatch(&apos;&lt;div style="position:absolute; top:50%; text-align:center; right:0pt; left:0pt;.*?&gt;(.*?)&lt;/div&gt;&apos;, sHtml, sLink)) {
      HmsLogMessage(2, PodcastItem.ItemOrigin.ItemParent[mpiTitle]+&apos;: vk.com сообщает - &apos;+HmsHtmlToText(sLink));
      if (random &gt; 0.5) MediaResourceLink = &apos;http://wonky.lostcut.net/vids/enotallow.avi&apos;;
      //else VideoMessage(&apos;&apos;, &apos;VK.COM СООБЩАЕТ:\n\n&apos;+HmsHtmlToText(sLink));
    } else {
      HmsLogMessage(2, mpTitle+&apos;: не удалось обработать ссылку на vk.com&apos;);
      MediaResourceLink = &apos;http://wonky.lostcut.net/vids/error_getlink.avi&apos;;
    }
    return true;
  }
  HmsRegExMatch(&apos;[^a-z]host[=:"\&apos;\\s]+(.*?)["\&apos;&amp;;,]&apos;, sHtml, host  );
  HmsRegExMatch(&apos;[^a-z]uid[=:"\&apos;\\s]+([0-9]+)&apos;,       sHtml, uid   );
  HmsRegExMatch(&apos;no_flv.*?(\\d)&apos;       ,              sHtml, no_flv);
  HmsRegExMatch(&apos;(?&gt;hd":"|hd=|video_max_hd.*?)(\\d)&apos;, sHtml, max_hd);
  HmsRegExMatch(&apos;[^a-z]vkid[=:"\&apos;\\s]+([0-9]+)&apos;,      sHtml, vkid  );
  HmsRegExMatch(max_hd+&apos;:(\\d+)&apos;,            ResolutionList, res   );
  
  sQAval = &apos;Доступное качество: &apos;; sQSel = &apos;&apos;;
  HmsRegExMatch(&apos;--quality=(\\d+)&apos;, mpPodcastParameters, sQSel);
  
  // Если включен приоритет форматов, то ищем ссылку на более приоритетное качество
  if (gbQualityLog || (mpPodcastMediaFormats!=&apos;&apos;)) for (i=StrToIntDef(max_hd, 3); i&gt;=0; i--) {
    HmsRegExMatch(IntToStr(i)+&apos;:(\\d+)&apos;, ResolutionList, sVal);
    sQAval += sVal + &apos;  &apos;;
    if (sQSel != &apos;&apos;) {
      if (StrToIntDef(res, 0)&gt;StrToIntDef(sQSel, 0)) res = sVal;
    } else if (mpPodcastMediaFormats != &apos;&apos;) {
      iPriority = HmsMediaFormatPriority(StrToIntDef(sVal, 0), mpPodcastMediaFormats);
      if ((iPriority&gt;=0)&amp;&amp;(iPriority&lt;iMinPriority)) {iMinPriority = iPriority; res=sVal;}
    }
  }
  if (gbQualityLog) HmsLogMessage(1, mpTitle+&apos;: &apos;+sQAval+&apos;Выбрано: &apos;+res);
  
  if (LeftCopy(uid, 1)!=&apos;u&apos;) uid = &apos;u&apos; + Trim(uid);
  if (Trim(host)==&apos;&apos;) HmsRegExMatch(&apos;ajax.preload.*?&lt;img[^&gt;]+src="(http://.*?/)&apos;, sHtml, host);
  
  if (uid==&apos;0&apos;) MediaResourceLink = host+&apos;assets/videos/&apos;+vtag+&apos;&apos;+vkid+&apos;.vk.flv&apos;;
  else          MediaResourceLink = host + uid+&apos;/videos/&apos;+vtag+&apos;.&apos;+res+&apos;.mp4&apos;;
  HmsRegExMatch(";url"+res+"=(.*?)&amp;", sHtml, MediaResourceLink);
  return true;
}

// --------------------------------------------------- Вход на сайт vk.com ----
bool LogInSiteVK() {
  string sHtml, sData, sName, sVal, sPost, sServ, sRet; int nFlag;
  bool success = true;
  TRegExpr RE = TRegExpr.Create(&apos;&lt;input[^&gt;]+name="(.*?)"[^&gt;]+value="(.*?)"&apos;, PCRE_SINGLELINE);
  
  sHtml = HmsDownloadURL("https://vk.com", "Referer: "+gsHeaders, true);
  sHtml = HmsRemoveLineBreaks(HmsUtf8Decode(sHtml));
  sPost = "";
  if (HmsRegExMatch(&apos;&lt;form[^&gt;]+quick_login(.*?)&lt;/form&gt;&apos;, sHtml, sData)) {
    if (RE.Search(sData)) do {
      sName = RE.Match(1);
      sVal  = RE.Match(2);
      if ((sName=="email") || (sName=="pass")) continue;
      sPost += Format("%s=%s&amp;", [sName, sVal]);
    } while (RE.SearchAgain());
    sPost += Format("email=%s&amp;pass=%s", [HmsHttpEncode(mpPodcastProxyUserName), HmsHttpEncode(mpPodcastProxyPassword)]);
    nFlag = StrToInt(&apos;$80000000&apos;); // INTERNET_FLAG_RELOAD;                                                                             
    sHtml = HmsSendRequestEx(&apos;login.vk.com&apos;, &apos;/?act=login&apos;, &apos;POST&apos;, &apos;application/x-www-form-urlencoded; Charset=UTF-8&apos;, gsHeaders, sPost, 443, nFlag, sRet, true);
    sHtml = sRet + Trim(sHtml);
    success = HmsRegExMatch("onLoginDone", sHtml, &apos;&apos;);
  }
  RE.Free();
  if (!success) {
    HmsLogMessage(2, "Неверно введён логин или пароль от vk.com в поля Использования прокси-сервера подкаста.");
  }
  return success;
}

// -------------------------------------------- Получение ссылки на vk.com ----
bool GetLink_VK(string sLink) {
  string sHtml, sVal, host, uid, vkid, vtag, max_hd, no_flv, res, extra, cat;
  string ResolutionList=&apos;0:240, 1:360, 2:480, 3:720&apos;, sQAval, sQSel, sID;
  int i, iPriority=0, iMinPriority=99; int nFlag=0; 
  
  sHtml = HmsDownloadURL(sLink, &apos;Referer: &apos;+sLink, true);
  
  if ((sHtml=="") || !HmsRegExMatch(&apos;vtag["\&apos;:=\\s]+([0-9a-z]+)&apos;, sHtml, vtag)) {
    LogInSiteVK();
    if (HmsRegExMatch2("oid=(.*?)&amp;.*?id=(.*?)&amp;", sLink, sVal, sID))
      sLink = "https://vk.com/video"+sVal+"_"+sID;
    sHtml = HmsDownloadUrl(sLink, &apos;Referer: &apos;+gsHeaders, true);
  }
  
  sHtml = ReplaceStr(sHtml, &apos;\\&apos;, &apos;&apos;);
  host = &apos;&apos;; max_hd = &apos;2&apos;;
  
  sLink = &apos;&apos;;
  HmsRegExMatch(&apos;--quality=(\\d+)&apos;, mpPodcastParameters, sQSel);
  if (sQSel!=&apos;&apos;) HmsRegExMatch(&apos;"url&apos;+sQSel+&apos;":"(.*?)"&apos;, sHtml, sLink);
  if (sLink==&apos;&apos;) HmsRegExMatch(&apos;"url720":"(.*?)"&apos;, sHtml, sLink);
  if (sLink==&apos;&apos;) HmsRegExMatch(&apos;"url480":"(.*?)"&apos;, sHtml, sLink);
  if (sLink==&apos;&apos;) HmsRegExMatch(&apos;"url360":"(.*?)"&apos;, sHtml, sLink);
  if (sLink==&apos;&apos;) HmsRegExMatch(&apos;"url240":"(.*?)"&apos;, sHtml, sLink);
  if (sLink!=&apos;&apos;) {
    MediaResourceLink = HmsJsonDecode(sLink);
    return;
  }
  
  if (!HmsRegExMatch(&apos;vtag["\&apos;:=\\s]+([0-9a-z]+)&apos;, sHtml, vtag)) {
    if (HmsRegExMatch(&apos;(&lt;div[^&gt;]+video_ext_msg.*?&lt;/div&gt;)&apos;, sHtml, sLink) ||
    HmsRegExMatch(&apos;&lt;div style="position:absolute; top:50%; text-align:center; right:0pt; left:0pt;.*?&gt;(.*?)&lt;/div&gt;&apos;, sHtml, sLink)) {
      HmsLogMessage(2, PodcastItem.ItemOrigin.ItemParent[mpiTitle]+&apos;: vk.com сообщает - &apos;+HmsHtmlToText(sLink));
      if (random &gt; 0.5) MediaResourceLink = &apos;http://wonky.lostcut.net/vids/enotallow.avi&apos;;
      //else VideoMessage(&apos;&apos;, &apos;VK.COM СООБЩАЕТ:\n\n&apos;+HmsHtmlToText(sLink));
    } else {
      HmsLogMessage(2, mpTitle+&apos;: не удалось обработать ссылку на vk.com&apos;);
      MediaResourceLink = &apos;http://wonky.lostcut.net/vids/error_getlink.avi&apos;;
    }
    return true;
  }
  HmsRegExMatch(&apos;[^a-z]host[=:"\&apos;\\s]+(.*?)["\&apos;&amp;;,]&apos;, sHtml, host  );
  HmsRegExMatch(&apos;[^a-z]uid[=:"\&apos;\\s]+([0-9]+)&apos;      , sHtml, uid   );
  HmsRegExMatch(&apos;no_flv.*?(\\d)&apos;                    , sHtml, no_flv);
  HmsRegExMatch(&apos;(?&gt;hd":"|hd=|video_max_hd.*?)(\\d)&apos;, sHtml, max_hd);
  HmsRegExMatch(&apos;[^a-z]vkid[=:"\&apos;\\s]+([0-9]+)&apos;     , sHtml, vkid  );
  HmsRegExMatch(&apos;extra=([\\w-]+)&apos;                   , sHtml, extra );
  HmsRegExMatch(&apos;/(\\d+)/u\\d+/&apos;                    , sHtml, cat   );
  
  HmsRegExMatch(max_hd+&apos;:(\\d+)&apos;,            ResolutionList, res   );
  
  sQAval = &apos;Доступное качество: &apos;; sQSel = &apos;&apos;;
  
  // Если включен приоритет форматов, то ищем ссылку на более приоритетное качество
  if (gbQualityLog || (mpPodcastMediaFormats!=&apos;&apos;)) for (i=StrToIntDef(max_hd, 3); i&gt;=0; i--) {
    HmsRegExMatch(IntToStr(i)+&apos;:(\\d+)&apos;, ResolutionList, sVal);
    sQAval += sVal + &apos;  &apos;;
    if (sQSel != &apos;&apos;) {
      if (StrToIntDef(res, 0)&gt;StrToIntDef(sQSel, 0)) res = sVal;
    } else if (mpPodcastMediaFormats != &apos;&apos;) {
      iPriority = HmsMediaFormatPriority(StrToIntDef(sVal, 0), mpPodcastMediaFormats);
      if ((iPriority&gt;=0)&amp;&amp;(iPriority&lt;iMinPriority)) {iMinPriority = iPriority; res=sVal;}
    }
  }
  if (gbQualityLog) HmsLogMessage(1, mpTitle+&apos;: &apos;+sQAval+&apos;Выбрано: &apos;+res);
  
  if (LeftCopy(uid, 1)!=&apos;u&apos;) uid = &apos;u&apos; + Trim(uid);
  if (Trim(host)==&apos;&apos;) HmsRegExMatch(&apos;ajax.preload.*?&lt;img[^&gt;]+src="(http://.*?/)&apos;, sHtml, host);
  
  if (uid==&apos;0&apos;) MediaResourceLink = host+&apos;assets/videos/&apos;+vtag+&apos;&apos;+vkid+&apos;.vk.flv&apos;;
  else          MediaResourceLink = host + uid+&apos;/videos/&apos;+vtag+&apos;.&apos;+res+&apos;.mp4&apos;;
  if (Trim(extra)!=&apos;&apos;) MediaResourceLink += &apos;?extra=&apos;+extra;
  if (Trim(cat  )!=&apos;&apos;) MediaResourceLink = ReplaceStr(MediaResourceLink, &apos;/&apos;+uid, &apos;/&apos;+cat+&apos;/&apos;+uid);
  
  HmsRegExMatch(";url"+res+"=(.*?)&amp;", sHtml, MediaResourceLink);
  return true;
}

///////////////////////////////////////////////////////////////////////////////
// Получение ссылки на Youtube ------------------------------------------------
void GetLink_Youtube31(string sLink) {
  string sData, sVideoID=&apos;&apos;, sMaxHeight=&apos;&apos;, sAudio=&apos;&apos;, sSubtitlesLanguage=&apos;ru&apos;,
  sSubtitlesUrl, sFile, sVal, sMsg, sConfig, sHeaders; 
  TJsonObject JSON; TRegExpr RegEx;
  
  sHeaders = &apos;Referer: &apos;+sLink+#13#10+
             &apos;User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36&apos;+#13#10+
             &apos;Origin: http://www.youtube.com&apos;+#13#10;
  
  HmsRegExMatch(&apos;--maxheight=(\\d+)&apos;    , mpPodcastParameters, sMaxHeight);
  HmsRegExMatch(&apos;--sublanguage=(\\w{2})&apos;, mpPodcastParameters, sSubtitlesLanguage);
  bool bSubtitles = (Pos(&apos;--subtitles&apos;  , mpPodcastParameters)&gt;0);  
  bool bAdaptive  = (Pos(&apos;--adaptive&apos;   , mpPodcastParameters)&gt;0);  
  bool bNotDE     = (Pos(&apos;notde=1&apos;      , sLink)&gt;0);  
  
  if (!HmsRegExMatch(&apos;[\\?&amp;]v=([^&amp;]+)&apos;       , sLink, sVideoID))
    if (!HmsRegExMatch(&apos;youtu.be/([^&amp;]+)&apos;      , sLink, sVideoID))
    HmsRegExMatch(&apos;/(?:embed|v)/([^\\?]+)&apos;, sLink, sVideoID);
  
  if (sVideoID==&apos;&apos;) { HmsLogMessage(2, &apos;Невозможно получить Video ID в ссылке Youtube&apos;); return; }
  
  sLink = &apos;http://www.youtube.com/watch?v=&apos;+sVideoID+&apos;&amp;hl=ru&amp;persist_hl=1&amp;has_verified=1&apos;;
  
  sData = HmsDownloadURL(sLink, sHeaders, true);
  sData = HmsRemoveLineBreaks(sData);
  if (!HmsRegExMatch(&apos;player.config\\s*?=\\s*?({.*?});&apos;, sData, sConfig)) {
    // Если в загруженной странице нет нужной информации, пробуем немного по-другому
    sLink = &apos;http://hms.lostcut.net/youtube/g.php?v=&apos;+sVideoID;
    if (sMaxHeight!=&apos;&apos;                  ) sLink += &apos;&amp;max_height=&apos;+sMaxHeight;
    if (Trim(mpPodcastMediaFormats )!=&apos;&apos;) sLink += &apos;&amp;media_formats=&apos;+mpPodcastMediaFormats;
    if (bAdaptive                       ) sLink += &apos;&amp;adaptive=1&apos;;
    sData = HmsUtf8Decode(HmsDownloadUrl(sLink));
    if (HmsRegExMatch(&apos;"reason":"(.*?)"&apos; , sData, sMsg)) { 
      HmsLogMessage(2 , sMsg); 
      //VideoMessage(sMsg); 
      return; 
    } else {
      sData = HmsJsonDecode(sData);
      HmsRegExMatch(&apos;"url":"(.*?)"&apos;, sData, MediaResourceLink);
      return;
    }
  }
  
  String hlsUrl, ttsUrl, flp, jsUrl, dashMpdLink, streamMap, playerId, algorithm;
  String sType, itag, sig, alg, s;
  String UrlBase = "";
  int  i, n, w, num, height, priority, minPriority = 90, selHeight, maxHeight = 1080;
  bool is3D; 
  TryStrToInt(sMaxHeight, maxHeight);
  JSON = TJsonObject.Create();
  try {
    JSON.LoadFromString(sConfig);
    hlsUrl      = HmsExpandLink(JSON.S[&apos;args\\hlsvp&apos; ], UrlBase);
    ttsUrl      = HmsExpandLink(JSON.S[&apos;args\\ttsurl&apos;], UrlBase);
    flp         = HmsExpandLink(JSON.S[&apos;url&apos;         ], UrlBase);
    jsUrl       = HmsExpandLink(JSON.S[&apos;assets\\js&apos;  ], UrlBase);
    streamMap   = JSON.S[&apos;args\\url_encoded_fmt_stream_map&apos;];
    if (bAdaptive &amp;&amp; JSON.B[&apos;args\\adaptive_fmts&apos;]) 
      streamMap = JSON.S[&apos;args\\adaptive_fmts&apos;];
    if ((streamMap==&apos;&apos;) &amp;&amp; (hlsUrl==&apos;&apos;)) {
      sMsg = "Невозможно найти данные для воспроизведения на странице видео.";
      if (HmsRegExMatch(&apos;(&lt;h\\d[^&gt;]+class="message".*?&lt;/h\\d&gt;)&apos;, sData, sMsg)) sMsg = HmsUtf8Decode(HmsHtmlToText(sMsg));
      HmsLogMessage(2, sMsg);
      //VideoMessage(sMsg); 
      return;
    }
  } finally { JSON.Free; }
  if (Copy(jsUrl, 1, 2)==&apos;//&apos;) jsUrl = &apos;http:&apos;+Trim(jsUrl);
  HmsRegExMatch(&apos;/player-([\\w_-]+)/&apos;, jsUrl, playerId);
  algorithm = HmsDownloadURL(&apos;https://hms.lostcut.net/youtube/getalgo.php?jsurl=&apos;+HmsHttpEncode(jsUrl));
  
  if (hlsUrl!=&apos;&apos;) {
    MediaResourceLink = &apos; &apos;+hlsUrl;
    
    sData = HmsDownloadUrl(sLink, sHeaders, true);
    RegEx = TRegExpr.Create(&apos;BANDWIDTH=(\\d+).*?RESOLUTION=(\\d+)x(\\d+).*?(http[^#]*)&apos;, PCRE_SINGLELINE);
    try {
      if (RegEx.Search(sData)) do {
        sLink = &apos;&apos; + RegEx.Match(4);
        height = StrToIntDef(RegEx.Match(3), 0);
        if (mpPodcastMediaFormats!=&apos;&apos;) {
          priority = HmsMediaFormatPriority(height, mpPodcastMediaFormats);
          if ((priority&gt;=0) &amp;&amp; (priority&gt;minPriority)) {
            MediaResourceLink = sLink; minPriority = priority;
          }
        } else if ((height &gt; selHeight) &amp;&amp; (height &lt;= maxHeight)) {
          MediaResourceLink = sLink; selHeight = height;
        }
      } while (RegEx.SearchAgain());
    } finally { RegEx.Free(); }
    
  } else if (streamMap!=&apos;&apos;) {
    i=1; while (i&lt;=Length(streamMap)) {
      sData = Trim(ExtractStr(streamMap, &apos;,&apos;, i));
      sType = HmsHttpDecode(ExtractParam(sData, &apos;type&apos;, &apos;&apos;, &apos;&amp;&apos;));
      itag  = ExtractParam(sData, &apos;itag&apos;    , &apos;&apos;, &apos;&amp;&apos;);
      is3D  = ExtractParam(sData, &apos;stereo3d&apos;, &apos;&apos;, &apos;&amp;&apos;) == &apos;1&apos;;
      sLink = &apos;&apos;;
      if (Pos(&apos;url=&apos;, sData)&gt;0) {
        sLink = &apos; &apos; + HmsHttpDecode(ExtractParam(sData, &apos;url&apos;, &apos;&apos;, &apos;&amp;&apos;));
        if (Pos(&apos;&amp;signature=&apos;, sLink)==0) {
          sig = HmsHttpDecode(ExtractParam(sData, &apos;sig&apos;, &apos;&apos;, &apos;&amp;&apos;));    
          if (sig==&apos;&apos;) {
            sig = HmsHttpDecode(ExtractParam(sData, &apos;s&apos;, &apos;&apos;, &apos;&amp;&apos;));
            for (w=1; w&lt;=WordCount(algorithm, &apos; &apos;); w++) {
              alg = ExtractWord(w, algorithm, &apos; &apos;);
              if (Length(alg)&lt;1) continue;
              if (Length(alg)&gt;1) TryStrToInt(Copy(alg, 2, 4), num);
              if (alg[1]==&apos;r&apos;) {s=&apos;&apos;; for(n=Length(sig); n&gt;0; n--) s+=sig[n]; sig = s;   } // Reverse
              if (alg[1]==&apos;s&apos;) {sig = Copy(sig, num+1, Length(sig));                     } // Clone
              if (alg[1]==&apos;w&apos;) {n = (num-Trunc(num/Length(sig)))+1; Swap(sig[1], sig[n]);} // Swap
            }
          }
          if (sig!=&apos;&apos;) sLink += &apos;&amp;signature=&apos; + sig;
        }
      }
      if (itag in ([139,140,141,171,172])) { sAudio = sLink; continue; }
      if (sLink!=&apos;&apos;) {
        height = 0; //http://www.genyoutube.net/formats-resolution-youtube-videos.html
        if      (itag in ([13,17,160                  ])) height = 144;
        else if (itag in ([5,36,92,132,133,242        ])) height = 240;
        else if (itag in ([6                          ])) height = 270;
        else if (itag in ([18,34,43,82,100,93,134,243 ])) height = 360;
        else if (itag in ([35,44,83,101,94,135,244,43 ])) height = 480;
        else if (itag in ([22,45,84,102,95,136,298,247])) height = 720;
        else if (itag in ([37,46,85,96,137,248,299    ])) height = 1080;
        else if (itag in ([264,271                    ])) height = 1440;
        else if (itag in ([266,138                    ])) height = 2160;
        else if (itag in ([272                        ])) height = 2304;
        else if (itag in ([38                         ])) height = 3072;
        else continue;
        if (mpPodcastMediaFormats!=&apos;&apos;) {
          priority = HmsMediaFormatPriority(height, mpPodcastMediaFormats);
          if ((priority&gt;=0) || (priority&lt;minPriority)) {
            MediaResourceLink = sLink; minPriority = priority; selHeight = height;
          }
        } else if ((height&gt;selHeight) &amp;&amp; (height&lt;= maxHeight)) {
          MediaResourceLink = sLink; selHeight = height;
        }
      }
    }
    if (bAdaptive &amp;&amp; (sAudio!=&apos;&apos;)) MediaResourceLink = &apos;-i "&apos;+Trim(MediaResourceLink)+&apos;" -i "&apos;+Trim(sAudio)+&apos;"&apos;;
    
  }
  // Если есть субтитры и в дополнительных параметрах указано их показывать - загружаем 
  if (bSubtitles &amp;&amp; (ttsUrl!=&apos;&apos;)) {
    sFile = HmsSubtitlesDirectory+&apos;\\Youtube\\&apos;+PodcastItem.ItemID+&apos;.&apos;+sSubtitlesLanguage+&apos;.srt&apos;;
    sLink = ttsUrl+&apos;&amp;fmt=srt&amp;lang=&apos;; 
    if (!HmsDownloadURLToFile(sLink+sSubtitlesLanguage, sFile, &apos;Accept-Encoding: gzip, deflate&apos;)) {
      HmsDownloadURLToFile(sLink+&apos;en&apos;                 , sFile, &apos;Accept-Encoding: gzip, deflate&apos;);
    }
    PodcastItem[mpiSubtitleLanguage] = sFile;
  }
}

///////////////////////////////////////////////////////////////////////////////
// Вывод видео сообщения с заданным текстом
void ShowVideoMessage(string sMsg, string sTitle=&apos;&apos;, int nErr=0, string sDescr=&apos;&apos;) {
  if (nErr==1) sMsg = &apos;&lt;c:#e22&gt;&apos;+Trim(sMsg); 
  TStrings INFO = TStringList.Create();
  INFO.Values[&apos;Title&apos; ] = sTitle;
  INFO.Values[&apos;Info&apos;  ] = sMsg;
  INFO.Values[&apos;Descr&apos; ] = sDescr;
  PodcastItem[mpiVideoMessage] = INFO.Text;
  INFO.Free();
  VideoPreview();
}

///////////////////////////////////////////////////////////////////////////////
// Формирование видео с картинкой с информацией о фильме
bool VideoPreview() {
  string sVal, sFileImage, sPoster, sTitle, sDescr, sCateg, sInfo, sLink, sData;
  int xMargin=7, yMargin=10, nSeconds=10, n; string sCacheDir;
  float nH=cfgTranscodingScreenHeight, nW=cfgTranscodingScreenWidth;
  // Проверяем и, если указаны в параметрах подкаста, выставляем значения смещения от краёв
  if (HmsRegExMatch(&apos;--xmargin=(\\d+)&apos;, mpPodcastParameters, sVal)) xMargin=StrToInt(sVal);
  if (HmsRegExMatch(&apos;--ymargin=(\\d+)&apos;, mpPodcastParameters, sVal)) yMargin=StrToInt(sVal);
  sCacheDir = IncludeTrailingBackslash(HmsTempDirectory);

  if (Trim(PodcastItem[mpiVideoMessage])==&apos;&apos;) return; // Если нет инфы - выходим быстро!
  TStrings INFO = TStringList.Create();       // Создаём объект TStrings
  INFO.Text  = PodcastItem[1001001];          // И загружаем туда информацию
  sPoster = INFO.Values[&apos;Poster&apos;];            // Постер
  sTitle  = INFO.Values[&apos;Title&apos; ];            // Самая верхняя надпись - Название
  sCateg  = INFO.Values[&apos;Genre&apos; ];            // Жанр
  sInfo   = INFO.Values[&apos;Info&apos;  ];            // Блок информации
  sDescr  = INFO.Values[&apos;Descr&apos; ];            // Описание
  if (sTitle==&apos;&apos;) sTitle = &apos; &apos;;
  ForceDirectories(sCacheDir);
  sFileImage = ExtractShortPathName(sCacheDir)+&apos;videopreview_&apos;; // Файл-заготовка для сохранения картинки
  sDescr = Copy(sDescr, 1, 3000); // Если блок описания получился слишком большой - обрезаем

  INFO.Text = ""; // Очищаем объект TStrings для формирования параметров запроса
  INFO.Values[&apos;prfx&apos; ] = gsPreviewPrefix;  // Префикс кеша сформированных картинок на сервере
  INFO.Values[&apos;title&apos;] = sTitle;           // Блок - Название
  INFO.Values[&apos;info&apos; ] = sInfo;            // Блок - Информация
  INFO.Values[&apos;categ&apos;] = sCateg;           // Блок - Жанр/категории
  INFO.Values[&apos;descr&apos;] = sDescr;           // Блок - Описание фильма
  INFO.Values[&apos;mlinfo&apos;] = &apos;20&apos;;            // Максимальное число срок блока Info
  INFO.Values[&apos;w&apos; ] = IntToStr(Round(nW)); // Ширина кадра
  INFO.Values[&apos;h&apos; ] = IntToStr(Round(nH)); // Высота кадра
  INFO.Values[&apos;xm&apos;] = IntToStr(xMargin);   // Отступ от краёв слева/справа
  INFO.Values[&apos;ym&apos;] = IntToStr(yMargin);   // Отступ от краёв сверху/снизу
  INFO.Values[&apos;bg&apos;] = &apos;http://www.pageresource.com/wallpapers/wallpaper/noir-blue-dark_3512158.jpg&apos;; // Катринка фона (кэшируется на сервере) 
  INFO.Values[&apos;fx&apos;] = &apos;3&apos;; // Номер эффекта для фона: 0-нет, 1-Blur, 2-more Blur, 3-motion Blur, 4-radial Blur
  INFO.Values[&apos;fztitle&apos;] = IntToStr(Round(nH/14)); // Размер шрифта блока названия (тут относительно высоты кадра)
  INFO.Values[&apos;fzinfo&apos; ] = IntToStr(Round(nH/22)); // Размер шрифта блока информации
  INFO.Values[&apos;fzcateg&apos;] = IntToStr(Round(nH/26)); // Размер шрифта блока жанра/категории
  INFO.Values[&apos;fzdescr&apos;] = IntToStr(Round(nH/18)); // Размер шрифта блока описания
  // Если текста описания больше чем нужно - немного уменьшаем шрифт блока
  if (Length(sDescr)&gt;890) INFO.Values[&apos;fzdescr&apos;] = IntToStr(Round(nH/20));
  // Если есть постер, задаём его параметры отображения (где, каким размером)
  if (sPoster!=&apos;&apos;) {
    INFO.Values[&apos;wpic&apos;  ] = IntToStr(Round(nW/4)); // Ширина постера (1/4 ширины кадра)
    INFO.Values[&apos;xpic&apos;  ] = &apos;10&apos;;    // x-координата постера
    INFO.Values[&apos;ypic&apos;  ] = &apos;10&apos;;    // y-координата постера
    if (mpFilePath==&apos;InfoUpdate&apos;) {
      INFO.Values[&apos;wpic&apos;  ] = IntToStr(Round(nW/6)); // Ширина постера (1/6 ширины кадра)
      INFO.Values[&apos;xpic&apos;  ] = IntToStr(Round(nW/2 - nW/12)); // центрируем
    }
    INFO.Values[&apos;urlpic&apos;] = sPoster; // Адрес изображения постера
  }
  sData = &apos;&apos;;  // Из установленных параметров формируем строку POST запроса
  for (n=0; n&lt;INFO.Count; n++) sData += &apos;&amp;&apos;+Trim(INFO.Names[n])+&apos;=&apos;+HmsHttpEncode(INFO.Values[INFO.Names[n]]);
  INFO.Free(); // Освобождаем объект из памяти, теперь он нам не нужен
  // Делаем POST запрос не сервер формирования картинки с информацией
  sLink = HmsSendRequestEx(&apos;wonky.lostcut.net&apos;, &apos;/videopreview.php?p=&apos;+gsPreviewPrefix, &apos;POST&apos;, 
               &apos;application/x-www-form-urlencoded&apos;, &apos;&apos;, sData, 80, 0, &apos;&apos;, true);
  // В ответе должна быть ссылка на сформированную картинку
  if (LeftCopy(sLink, 4)!=&apos;http&apos;) {HmsLogMessage(2, &apos;Ошибка получения файла информации videopreview.&apos;); return;}
  // Сохраняем сформированную картинку с информацией в файл на диске
  HmsDownloadURLToFile(sLink, sFileImage);
  // Копируем и нумеруем файл картики столько раз, сколько секунд мы будем её показывать
  for (n=1; n&lt;=nSeconds; n++) CopyFile(sFileImage, sFileImage+Format(&apos;%.3d.jpg&apos;, [n]), false);
  // Для некоторых телевизоров (Samsung) видео без звука отказывается проигрывать, поэтому скачиваем звук тишины
  char sFileMP3 = ExtractShortPathName(HmsTempDirectory)+&apos;\\silent.mp3&apos;;
  try {
    if (!FileExists(sFileMP3)) HmsDownloadURLToFile(&apos;http://wonky.lostcut.net/mp3/silent.mp3&apos;, sFileMP3);
    sFileMP3 = &apos;-i "&apos;+sFileMP3+&apos;"&apos;;
  } except { sFileMP3=&apos;&apos;; }
  // Формируем из файлов пронумерованных картинок и звукового команду для формирования видео
  MediaResourceLink = Format(&apos;%s -f image2 -r 1 -i "%s" -c:v libx264 -pix_fmt yuv420p &apos;, [sFileMP3, sFileImage+&apos;%03d.jpg&apos;]);
}

///////////////////////////////////////////////////////////////////////////////
// Получение реального названия и картинки для серии сериала из gsTVDBInfo
void GetSerialInfo(THmsScriptMediaItem Item, int nSeason, int nEpisode) {
  string sName, sImg;
  if (!gbUseSerialKPInfo ) return; if (gsTVDBInfo==&apos;&apos;) LoadKPSerialInfo();
  if (HmsRegExMatch2(&apos;s&apos;+Str(nSeason)+&apos;e&apos;+Str(nEpisode)+&apos;=(.*?);t=(.*?)\\|&apos;, gsTVDBInfo, sImg, sName)) {
    if (sImg !="") Item[mpiThumbnail] = sImg;
    if (sName!="") Item[mpiTitle    ] = Format("%.2d %s", [nEpisode, sName]);
    Item[mpiSeriesEpisodeNo   ] = nEpisode;
    Item[mpiSeriesSeasonNo    ] = nSeason;
    Item[mpiSeriesEpisodeTitle] = sName;
    Item[mpiSeriesTitle       ] = PodcastItem[mpiSeriesTitle];
  }
}

///////////////////////////////////////////////////////////////////////////////
// Получение информации с Kinopoisk о сериале
void LoadKPSerialInfo() {
  string sID, sData, sHtml, sName, sVal, sHeaders, sYear; int nEpisode, nSeason, n; TRegExpr RE;
  if (gsTVDBInfo!=&apos;&apos;) return;
  sID = Trim(PodcastItem[100500]); // Получаем запомненный kinopoisk ID
  if (sID==&apos;&apos;) HmsRegExMatch(&apos;/images/(film|film_big)/(\\d+)&apos;, mpThumbnail, sID, 2); // Или пытаемся его получить из картинки
  if ((sID!=&apos;&apos;) &amp;&amp; (sID!=&apos;0&apos;)) {
    // Проверяем, была ли уже загружена информация для такого количества серий
    if ((PodcastItem[100508]!=&apos;&apos;) &amp;&amp; (PodcastItem[100508]==PodcastItem[100509])) {
      gsTVDBInfo = PodcastItem[100507];
      return;
    }
    sHeaders = &apos;Referer: https://kinopoisk.ru/\r\n&apos;+
               &apos;Accept-Encoding: gzip, deflate\r\n&apos;+
               &apos;User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko/20100101 Firefox/13.0\r\n&apos;;
    sHtml = HmsDownloadURL("https://www.kinopoisk.ru/film/"+sID+"/episodes/", sHeaders, true);
    if (HmsRegExMatch2(&apos;&lt;td[^&gt;]+class="news"&gt;([^&lt;]+),\\s+(\\d{4})&apos;, sHtml, sName, sYear)) {
      // Если получили оригинальное название сериала - пробуем загрузить инфу с картинками
      sName = ReplaceStr(sName, &apos; &apos;, &apos;_&apos;);
      gsTVDBInfo = HmsUtf8Decode(HmsDownloadURL(&apos;http://wonky.lostcut.net/tvdb.php?n=&apos;+sName+&apos;&amp;y=&apos;+sYear, sHeaders, true));
    }
    if (gsTVDBInfo==&apos;&apos;) {
      RE = TRegExpr.Create(&apos;(&lt;h[^&gt;]+moviename-big.*?)&lt;/h&apos;, PCRE_SINGLELINE);
      nSeason  = 1;
      nEpisode = 1;
      if (RE.Search(sHtml)) do {
        sName = HmsHtmlToText(re.Match());
        if (HmsRegExMatch("Сезон\\s*?(\\d+)", sName, sVal)) { nSeason=StrToInt(sVal); nEpisode=1; continue; }
        gsTVDBInfo += &apos;s&apos;+Str(nSeason)+&apos;e&apos;+Str(nEpisode)+&apos;=;t=&apos;+sName+&apos;|&apos;;
        nEpisode++;
      } while (RE.SearchAgain());
    }
    if (gsTVDBInfo==&apos;&apos;) gsTVDBInfo = &apos;-&apos;;
  }
  PodcastItem[100507] = gsTVDBInfo;          // Запоминаем инфу 
  PodcastItem[100509] = PodcastItem[100508]; // для такого количества серий
}

///////////////////////////////////////////////////////////////////////////////
// Вывод вместо видео заданного сообщения
bool VideoMessage(char sCaption, char sMessage, int nTime=30) {
  char sFileImage = HmsTempDirectory+&apos;\\videomessage.jpg&apos;; char sCmd;
  sCaption = HmsHttpEncode(ReplaceStr(sCaption, &apos;\n&apos;, &apos;|&apos;));
  sMessage = HmsHttpEncode(ReplaceStr(sMessage, &apos;\n&apos;, &apos;|&apos;));
  HmsDownloadURLToFile(&apos;http://wonky.lostcut.net/videomessage.php?testpic=1&amp;caption=&apos;+sCaption+&apos;&amp;msg=&apos;+sMessage, sFileImage);
  char sFileMP3 = HmsTempDirectory+&apos;\\silent.mp3&apos;;
  try {
    if (!FileExists(sFileMP3)) HmsDownloadURLToFile(&apos;http://wonky.lostcut.net/mp3/silent.mp3&apos;, sFileMP3);
    sFileMP3 = &apos;-i "&apos;+sFileMP3+&apos;"&apos;;
  } except {
    sFileMP3 = &apos;&apos;;
  }
  sCmd = Format(&apos;%s -loop 1 -f image2 -i "%s" -t %d -r 25 &apos;, [ExtractShortPathName(sFileMP3), ExtractShortPathName(sFileImage), 7]);
  MediaResourceLink = sCmd;
}

///////////////////////////////////////////////////////////////////////////////
// Вывод видео сообщения с информацией о фильме
void ShowVideoInfo() {
  string sInfo; THmsScriptMediaItem Parent = PodcastItem.ItemParent;

  sInfo = &apos;&apos;;
  if (Trim(Parent[mpiCountry  ])!=&apos;&apos;) sInfo += &apos;Страна: &apos;  +Parent[mpiCountry  ]+"|";
  if (Trim(Parent[mpiTranslate])!=&apos;&apos;) sInfo += &apos;Перевод: &apos; +Parent[mpiTranslate]+"|";
  if (Trim(Parent[mpiQuality  ])!=&apos;&apos;) sInfo += &apos;Качество: &apos;+Parent[mpiQuality  ]+"|";
  if (Trim(Parent[mpiDirector ])!=&apos;&apos;) sInfo += &apos;Режиссер: &apos;+Parent[mpiDirector ]+"|";
  if (Trim(Parent[mpiActor    ])!=&apos;&apos;) sInfo += &apos;В ролях: &apos; +Parent[mpiActor    ]+"|";
  sInfo = Copy(sInfo, 1, Length(sInfo)-1); // Обрезаем последний символ "|"
  TStrings INFO = TStringList.Create();
  INFO.Values[&apos;Poster&apos;] = Parent[mpiThumbnail];
  INFO.Values[&apos;Title&apos; ] = Parent[mpiTitle];
  INFO.Values[&apos;Genre&apos; ] = Parent[mpiGenre];
  INFO.Values[&apos;Info&apos;  ] = sInfo;
  INFO.Values[&apos;Descr&apos; ] = ReplaceStr(Parent[mpiComment], "\n", "|");
  PodcastItem[mpiVideoMessage] = INFO.Text;
  INFO.Free();
  VideoPreview();
}

///////////////////////////////////////////////////////////////////////////////
/// Создание ссылок на файл(ы) по переданной ссылке (шаблону) -------------
void CreateVideoLink(THmsScriptMediaItem Folder, string sName, string sLink, bool bSeparateInFolders=false) {
  string sCut, sQualArray, sQual, sFile; int i, nCount; // Объявляем переменные

  // Проверяем, есть ли в переданной ссылке шаблон с массивом существующего качества "[720,480,360]"
  if (HmsRegExMatch(&apos;\\[(.*?)\\]&apos;, sLink, sQualArray)) {
    sCut   = &apos;[&apos;+sQualArray+&apos;]&apos;;                   // Та часть, которая будет заменятся на индификатор качества
    nCount = WordCount (sQualArray, &apos;,&apos;);          // Количество елементов, разделённых запятой
    for (i=1; i&lt;=nCount; i++) {
      sQual = ExtractWord(i, sQualArray, &apos;,&apos;);     // Получаем очередной индификатор качества
      if (sQual==&apos;&apos;) continue;                     // Может быть пропущен, если не указан
      sFile = ReplaceStr(sLink, sCut, sQual);      // Формируем ссылку на файл, заменяя шаблон на индификатор качества
      if (bSeparateInFolders) {                    // Если был передан флаг "Группировать файлы качества по разным папкам",
        CreateMediaItem(Folder, sName, sFile, sQual); // то передаём индификатор качества как имя группы, где будет создана ссылка
      } else {                                     
        if (sName==&apos;&apos;) HmsRegExMatch(&apos;.*/(.*)&apos;, sLink, sName); // Получаем имя файла из ссылки (всё что идёт после последнего слеша)
        sName = ReplaceStr(sName, sCut, &apos;&apos;);          // Убираем перечисление качества из имени
        sName = ReplaceStr(sName, &apos;_&apos;, &apos;&apos;);           // А также подчекривания (лишние)
        CreateMediaItem(Folder, sQual+&apos; &apos;+sName, sFile); // Добавляем индификатор качества к началу имени и создаём ссылку
      }
    }

  } else {
    // Если шаблона выбора качества в ссылке нет, то просто создаём ссылку
    if (sName==&apos;&apos;) HmsRegExMatch(&apos;.*/(.*)&apos;, sLink, sName); // Если имя пустое, получаем имя файла из ссылки (всё что идёт после последнего слеша)
    CreateMediaItem(Folder, sName, sLink);                    

  }
}

///////////////////////////////////////////////////////////////////////////////
// Создание серий из плейлиста
void CreateSeriesFromPlaylist(THmsScriptMediaItem Folder, string sLink, string sName=&apos;&apos;) {
  string sData, s1, s2, s3; int i; TJsonObject JSON, PLITEM; TJsonArray PLAYLIST; // Объявляем переменные
  
  // Если передано имя плейлиста, то создаём папку, в которой будем создавать элементы
  if (Trim(sName)!=&apos;&apos;) Folder = Folder.AddFolder(sName);
  
  // Если в переменной sLink сожержится знак &apos;{&apos;, то там не ссылка, а сами данные Json
  if (Pos(&apos;{&apos;, sLink)&gt;0) {
    sData = sLink;
  } else {
    sData = HmsDownloadURL(sLink, "Referer: "+mpFilePath, true);  // Загружаем плейлист
    sData = HmsUtf8Decode(sData);   
  }
  
  JSON  = TJsonObject.Create();                 // Создаём объект для работы с Json
  try {
    JSON.LoadFromString(sData);                 // Загружаем json данные в объект
    PLAYLIST = JSON.A[&apos;playlist&apos;];              // Пытаемся получить array с именем &apos;playlist&apos;
    if (PLAYLIST==nil) PLAYLIST = JSON.AsArray; // Если массив &apos;playlist&apos; получить не получилось, то представляем все наши данные как массив
    if (PLAYLIST!=nil) {                        // Если получили массив, то запускаем обход всех элементов в цикле
      for (i=0; i&lt;PLAYLIST.Length; i++) {
        PLITEM = PLAYLIST[i];                   // Получаем текущий элемент массива
        sName = PLITEM.S[&apos;comment&apos;];            // Название - значение поля comment
        sLink = PLITEM.S[&apos;file&apos;   ];            // Получаем значение ссылки на файл
        sName = ReplaceStr(ReplaceStr(HmsHtmlToText(sName, 65001), "\n", &apos; &apos;), "\r", &apos;&apos;);
        // Форматируем числовое представление серий в названии
        // Если в названии есть число, то будет в s1 - то, что стояло перед ним, s2 - само число, s3 - то, что было после числа
        if (HmsRegExMatch3(&apos;^(.*?)(\\d+)(.*)$&apos;, sName, s1, s2, s3))
          sName = Trim(Format(&apos;%s %.2d %s&apos;, [s1, StrToInt(s2), s3])); // Форматируем имя - делаем число двухцифровое (01, 02...)
        if (LeftCopy(sLink, 4)==&apos;oid=&apos;) sLink = &apos;http://vk.com/video_ext.php?&apos;+Trim(sLink);
        
        // Проверяем, если это вложенный плейлист - запускаем создание элементов из этого плейлиста рекурсивно
        if (PLITEM.B[&apos;playlist&apos;])
          CreateSeriesFromPlaylist(Folder, PLITEM.S[&apos;playlist&apos;], sName);
        else
          CreateMediaItem(Folder, sName, sLink); // Иначе просто создаём ссылки на видео
      }
    } // end if (PLAYLIST!=nil)
    
  } finally { JSON.Free; }                      // Какие бы ошибки не случились, освобождаем объект из памяти
}

///////////////////////////////////////////////////////////////////////////////
// Конвертация продолжительности из формата youtube (ISO8601) в формат HMS
string ConvertYoutubeTime(string sTime) {
  string sVal; int nSeconds = 0;
  if (HmsRegExMatch(&apos;(\\d+)H&apos;, sTime, sVal)) nSeconds += StrToInt(sVal)*3600;  
  if (HmsRegExMatch(&apos;(\\d+)M&apos;, sTime, sVal)) nSeconds += StrToInt(sVal)*60;  
  if (HmsRegExMatch(&apos;(\\d+)S&apos;, sTime, sVal)) nSeconds += StrToInt(sVal);
  if (nSeconds==0) nSeconds = 600;
  return HmsTimeFormat(nSeconds)+&apos;.000&apos;;
}

///////////////////////////////////////////////////////////////////////////////
// Создание папок сезонов
void CreateSeasons(string sHtml) {
  string sData, sLink, sName, sTime, sImg, sVal, s1, s2, s3, sSeason;
  THmsScriptMediaItem Item; TRegExpr RegEx; int n;
  
  HmsRegExMatch(&apos;&lt;seasons&gt;(.*?)&lt;/seasons&gt;&apos;, sHtml, sData);
  RegEx = TRegExpr.Create(&apos;(&lt;a.*?&lt;/a&gt;)&apos;, PCRE_SINGLELINE);
  n = 0;
  try {
    if (RegEx.Search(sHtml)) do {
      sLink=&apos;&apos;; sName=&apos;&apos;;
      HmsRegExMatch(&apos;(&lt;a.*?&lt;/a&gt;)&apos;        , RegEx.Match, sName);
      HmsRegExMatch(&apos;&lt;a[^&gt;]+href="(.*?)"&apos;, RegEx.Match, sLink);
      if (Trim(sLink)=="") continue;
      n++;
      
      sName = ReplaceStr(HmsHtmlToText(sName), "/", "-");
      sLink = HmsExpandLink(sLink, gsUrlBase);

      // Форматируем номера сезонов в двуцифровой формат
      if (HmsRegExMatch3(&apos;^(.*?)(\\d+)(.*)&apos;, sName, s1, s2, s3))
        sName = Trim(Format(&apos;%s %.2d %s&apos;, [s1, StrToInt(s2), s3]));
      
      sLink += &apos;&amp;season=&apos;+IntToStr(n);
      CreateFolder(PodcastItem, sName, sLink); // Создание папки сезона

    } while (RegEx.SearchAgain);
  } finally { RegEx.Free(); }
}

// -------------------------------- Создание дерева ссылок из объекта Json ----
void CreateItemsFromJson(TJsonObject jsonParent, THmsScriptMediaItem Folder) {
  char sTitle, sLink, sVal; int i; TJsonObject jsonObject; THmsScriptMediaItem Item;
  if (jsonParent == nil) return;
  for (i=0; i&lt;jsonParent.Count; i++) {
    jsonObject = jsonParent.Values[i];
    if (jsonObject["playlist"] != nil) {
      sTitle = Trim(HmsHtmlToText(jsonObject.S["comment"]));
      sTitle = ReplaceStr(ReplaceStr(sTitle, &apos;\r&apos;, &apos;&apos;), &apos;\n&apos;, &apos;-&apos;);
      Item = Folder.AddFolder(sTitle);
      Item[mpiCreateDate] = VarToStr(IncTime(gStart,0,-gnTotalItems,0,0)); gnTotalItems++;
      CreateItemsFromJson(jsonObject["playlist"], Item);
    } else {
      sLink  = jsonObject.S["file"];
      sTitle = Trim(HmsHtmlToText(jsonObject.S["comment"]));
      sTitle = ReplaceStr(ReplaceStr(sTitle, &apos;\r&apos;, &apos;&apos;), &apos;\n&apos;, &apos;-&apos;);
      
      // Форматируем номер в два знака
      if (HmsRegExMatch("(\\d+)", sTitle, sVal)) 
        sTitle = ReplaceStr(sTitle, sVal, Format("%.2d", [StrToInt(sVal)]));
      
      Item = HmsCreateMediaItem(sLink, Folder.ItemID);
      Item[mpiTitle     ] = sTitle;
      Item[mpiCreateDate] = VarToStr(IncTime(gStart,0,-gnTotalItems,0,0));
      Item[mpiTimeLength] = gsTime;
      Item[mpiThumbnail ] = mpThumbnail;
      gnTotalItems++;
    }
  }
}

// ------------------------------------- создание плейлиста из строки json ----
void PlaylistFromJsonString(char sData, THmsScriptMediaItem PrntItem) {
  HmsRegExMatch("({.*})", sData, sData);  // Избавляемся от UTF BOM если есть
  TJsonObject JSON = TJsonObject.Create();
  try {
    JSON.LoadFromString(sData);
    CreateItemsFromJson(JSON["playlist"], PrntItem);
  } finally {
    JSON.Free();
  }
}

///////////////////////////////////////////////////////////////////////////////
// Создание списка серий сериала с Moonwalk.cc
void CreateMoonwallkLinks(string sLink) {
  String sHtml, sData, sServ, sRef, sSerie, sVal, sHeaders, sID, sSub, sFile;
  int n, nEpisode, nSeason; THmsScriptMediaItem Item, Folder = PodcastItem;
  TJsonObject JSON; TJsonArray JARRAY, EPISODE; bool bOneSeason;
  
  sHeaders = sLink+&apos;/\r\n&apos;+
             &apos;Accept-Encoding: gzip, deflate\r\n&apos;+
             &apos;User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko/20100101 Firefox/13.0\r\n&apos;+
             &apos;X-Requested-With: XMLHttpRequest\r\n&apos;;
  
  gbUseSerialKPInfo = Pos("--usekpinfo", mpPodcastParameters) &gt; 0;
  
  sHtml = HmsDownloadURL(sLink, &apos;Referer: &apos;+sHeaders, true);
  if (HmsRegExMatch(&apos;&lt;body&gt;\\s*?&lt;/body&gt;&apos;, sHtml, &apos;&apos;)) {
    HmsRegExReplace(&apos;(.*?moonwalk.)(co|pw)(.*)&apos;, sLink, &apos;$1cc$3&apos;, sLink);
    sHtml = HmsDownloadURL(sLink, &apos;Referer: &apos;+sHeaders, true);
  }
  if (HmsRegExMatch(&apos;&lt;iframe[^&gt;]+src="(http.*?)"&apos;, sHtml, sLink)) sHtml = HmsDownloadURL(sLink, &apos;Referer: &apos;+sHeaders, true);
  sHtml = HmsRemoveLineBreaks(HmsUtf8Decode(sHtml));
  
  if (Trim(mpSeriesTitle)==&apos;&apos;) { PodcastItem[mpiSeriesTitle] = mpTitle; HmsRegExMatch(&apos;^(.*?)[\\(\\[]&apos;, mpTitle, PodcastItem[mpiSeriesTitle]); }
  
  if (!HmsRegExMatch(&apos;VideoBalancer\\((.*?)\\);&apos;, sHtml, sData)) {
    HmsLogMessage(2, mpTitle+&apos;: Не найдены данные VideoBalancer в iframe.&apos;);
    return;    
  }
  JSON = TJsonObject.Create();
  try {
    JSON.LoadFromString(sData);
    HmsRegExMatch("&apos;(.*?)&apos;", JSON.S[&apos;ref&apos;], sRef);
    nSeason = 0;
    if (HmsRegExMatch2(&apos;^(.*?)\\?season=(\\d+)&apos;, sLink, sLink, sVal)) nSeason = StrToInt(sVal);
    
    // Подсчитываем количество серий и запоминаем в укромном месте
    n = JSON[&apos;episodes&apos;].Count; PodcastItem[100508] = Str(n);
    JARRAY = JSON.A[&apos;seasons&apos;];
    // Если в ссылке указан номер сезона - показываем только серии этого сезона
    // Если сезон всего один и номер его = 1, то сразу выкатываем серии
    if (JARRAY != nil) bOneSeason = (JARRAY.Length == 1) &amp;&amp; (JARRAY.I[0] == 1);
    if ((nSeason &gt; 0) || bOneSeason) {
      gsTime = &apos;00:45:00.000&apos;;
      JARRAY = JSON.A[&apos;episodes&apos;];
      for (n=0; n &lt; JARRAY.Length; n++) {
        EPISODE  = JARRAY[n].AsArray;
        nSeason  = EPISODE.I[0];
        nEpisode = EPISODE.I[1];
        sSerie   = Format("%.2d серия", [nEpisode]); // Форматируем номер в два знака
        Item = CreateMediaItem(Folder, sSerie, sLink+&apos;?season=&apos;+Str(nSeason)+&apos;&amp;episode=&apos;+Str(nEpisode)+&apos;&amp;ref=&apos;+sRef);
        if (JSON.S["subtitles\\master_vtt"]!="") Item[mpiSubtitleLanguage] = HmsSubtitlesDirectory+&apos;\\&apos;+PodcastItem.ItemID+&apos;.srt&apos;;
        GetSerialInfo(Item, nSeason, nEpisode);
      }
    } else if (JARRAY != nil) {
      // Создаём список сезонов как папки
      for (n=0; n &lt; JARRAY.Length; n++) {
        nSeason  = JARRAY.I[n];
        sSerie   = Format("%d сезон", [nSeason]); // Форматируем номер в два знака
        Item = CreateFolder(Folder, sSerie, sLink+&apos;?season=&apos;+Str(nSeason)+&apos;&amp;ref=&apos;+sRef, mpThumbnail);
        Item[mpiSeriesTitle] = PodcastItem[mpiSeriesTitle];
      }
    } else {
      // Просто ссылка на фильм
      Item = CreateMediaItem(Folder, mpTitle, sLink);
    }
    
  } finally { JSON.Free; }
}

///////////////////////////////////////////////////////////////////////////////
string NormVal(string sVal) {
  string sName = HmsHtmlToText(sVal);
  sName = ReplaceStr(sName, &apos;|&apos;, &apos;&apos;);
  return Trim(sName);
}

///////////////////////////////////////////////////////////////////////////////
// Создание ссылок видео
void CreateLinks() {
  string sHtml, sData, sLink, sName, sTime, sImg, sVal, sSeason, sID;
  THmsScriptMediaItem Item; TStrings FilmInfo;
  
  if (Pos(&apos;/iframe?season=&apos;, mpFilePath)&gt;0) {
    CreateMoonwallkLinks(mpFilePath);
    return;
  }
  
  sHtml = HmsUtf8Decode(HmsDownloadUrl(mpFilePath, &apos;Referer: &apos;+gsUrlBase, true));

  THmsScriptMediaItem ; TRegExpr RegEx;
  
  sSeason = &apos;&apos;;
  HmsRegExMatch(&apos;season=(\\d+)&apos;, mpFilePath, sSeason);
  
  sHtml = HmsDownloadURL(mpFilePath, &apos;Referer: &apos;+mpFilePath, true);
  sHtml = HmsUtf8Decode(sHtml);
  sHtml = HmsRemoveLineBreaks(sHtml);
  
  // =========================================================================
  // Сбор информации о фильме
  if (HmsRegExMatch(&apos;Год выпуска :&lt;/dt&gt;&lt;dd&gt;.*?(\\d{4})&lt;/a&gt;&lt;/dd&gt;&apos;, sHtml, sVal)) PodcastItem[mpiYear] = sVal;
  if (HmsRegExMatch(&apos;Время :.*?(\\d{2}:\\d{2}:\\d{2})&apos;, sHtml, sVal)) gsTime = sVal+&apos;.000&apos;;
  if (HmsRegExMatch(&apos;Время :.*?(\\d+)\\s*мин&apos;, sHtml, sVal)) gsTime = HmsTimeFormat(StrToInt(sVal)*60)+&apos;.000&apos;;
  if (HmsRegExMatch(&apos;&lt;dt&gt;Жанр :&lt;/dt&gt;&lt;dd itemprop="genre"&gt;(.+?)&lt;/dd&gt;&apos;    , sHtml, sVal)) PodcastItem[mpiGenre    ] = NormVal(sVal);
  if (HmsRegExMatch(&apos;&lt;/dd&gt;&lt;dt&gt;Kинопоиск : &lt;/dt&gt;&lt;dd&gt;(.+?)&lt;span style="font-size:9px;"&gt;(.+?)&lt;/span&gt;&lt;/dd&gt;&lt;/dl&gt;&apos;    , sHtml, sVal)) PodcastItem[mpiRating    ] = NormVal(sVal);
  if (HmsRegExMatch(&apos;&lt;dt&gt;Время :&lt;/dt&gt;&lt;dd&gt;(.+?)&lt;/dd&gt;&apos;    , sHtml, sVal)) PodcastItem[mpiTimeLength    ] = NormVal(sVal);
  if (HmsRegExMatch(&apos;&lt;/dd&gt;&lt;dt&gt;IMDB : &lt;/dt&gt;&lt;dd&gt;(.+?)&lt;span style="font-size:9px;"&gt;(.+?)&lt;/span&gt;&lt;/dd&gt;&lt;/dl&gt;&apos;    , sHtml, sVal)) PodcastItem[mpiIMDBInfo    ] = NormVal(sVal);
  if (HmsRegExMatch(&apos;&lt;dt&gt;Страна :&lt;/dt&gt;&lt;dd&gt;(.+?)&lt;/dd&gt;&apos;  , sHtml, sVal)) PodcastItem[mpiCountry  ] = NormVal(sVal);
  if (HmsRegExMatch(&apos;&lt;dt&gt;Перевод :&lt;/dt&gt;&lt;dd&gt;(.+?)&lt;/dd&gt;&apos; , sHtml, sVal)) PodcastItem[mpiTranslate] = NormVal(sVal);
  if (HmsRegExMatch(&apos;&lt;dt&gt;Качество :&lt;/dt&gt;&lt;dd&gt;(.+?)&lt;/dd&gt;&apos;, sHtml, sVal)) PodcastItem[mpiQuality  ] = NormVal(sVal);
  if (HmsRegExMatch(&apos;&lt;dt&gt;Режиссер :&lt;/dt&gt;&lt;dd itemprop="director"&gt;(.+?)&lt;/dd&gt;&apos;, sHtml, sVal)) PodcastItem[mpiDirector ] = NormVal(sVal);
  if (HmsRegExMatch(&apos;&lt;dt&gt;В ролях :&lt;/dt&gt;&lt;dd itemprop="actors"&gt;(.+?)&lt;/dd&gt;&apos; , sHtml, sVal)) PodcastItem[mpiActor    ] = NormVal(sVal);
  if (HmsRegExMatch(&apos;&lt;dt&gt;Премьера :&lt;/dt&gt;&lt;dd&gt;(.+?)&lt;/dd&gt;&apos; , sHtml, sVal)) PodcastItem[mpiAlbum    ] = NormVal(sVal);
  if (HmsRegExMatch(&apos;&lt;dt&gt;Студия :&lt;/dt&gt;&lt;dd&gt;(.+?)&lt;/dd&gt;&apos;    , sHtml, sVal)) PodcastItem[mpiMood ] = NormVal(sVal);
  if (HmsRegExMatch(&apos;(&lt;span itemprop="description"&gt;.*?)&lt;/div&gt;&apos;, sHtml, sVal)) PodcastItem[mpiComment] = NormVal(sVal);
  if (HmsRegExMatch(&apos;&lt;dt&gt;Оригинальное название :&lt;/dt&gt;&lt;dd&gt;(.+?)&lt;/dd&gt;&lt;br/&gt;&apos;, sHtml, sVal)) mpTitle = NormVal(sVal);
  HmsRegExMatch(&apos;itemprop="thumbnail" content="(.*?)"&apos;, sHtml, mpThumbnail);
  PodcastItem[mpiTimeLength] = gsTime;
  PodcastItem[mpiThumbnail ] = mpThumbnail;
  HmsRegExMatch(&apos;^(.*?)/&apos;, mpTitle, mpTitle);
  // =========================================================================
  
  HmsRegExMatch("Base64.decode\\(&apos;(.*?)&apos;", sHtml, sVal);
  sData = HmsRemoveLineBreaks(HmsUtf8Decode(HmsBase64Decode(sVal)));

  // Если на странице есть перечисление сезонов и в данный момент мы не в конкретном
  if ((sSeason==&apos;&apos;) &amp;&amp; HmsRegExMatch(&apos;&lt;Все сезоны сериала&gt;&apos;, sHtml, sLink)) {
    // Создаём список сезонов
    CreateSeasons(sHtml);
  
  } else if (HmsRegExMatch(&apos;flashvars[^&gt;]+file=(.*?)[&amp;"]&apos;, sHtml, sLink)) {
    // Создаём ссылку на конкретный фильм    
    CreateMediaItem(PodcastItem, mpTitle, sLink);
    
  } else if (HmsRegExMatch(&apos;flashvars[^&gt;]+pl=(.*?)[&amp;"]&apos;, sHtml, sLink)) {
    // Создаём ссылки на серии из плейлиста   
    sData = HmsUtf8Decode(HmsDownloadURL(sLink, &apos;Referer: &apos;+mpFilePath, true));   
    HmsRegExMatch(&apos;(\\{.*\\})&apos;, sData, sData);
    CreateSeriesFromPlaylist(PodcastItem, sData);
        
  } else if (HmsRegExMatch(&apos;vkArr=(\\[.*?\\]);&apos;, sHtml, sVal)) {
    // Создаём ссылки на серии из плейлиста в переменной vkArr
    CreateSeriesFromPlaylist(PodcastItem, sVal);
        
  }
   
    // Создаем ссылку на Moonwalk
    if (HmsRegExMatch(&apos;&lt;iframe[^&gt;]+src="([^"]+/(serial|video)/.*?/iframe)&apos;, sHtml, sLink)) {
      CreateMediaItem(PodcastItem, mpTitle, sLink);
    if (HmsRegExMatch(&apos;"([^"]+/(serial|video)/.*?/iframe)&apos;, sData, sLink));
      HmsRegExMatch(&apos;"title"\\s*:\\s*"(.*?)"&apos;, sData, mpTitle);
      CreateMoonwallkLinks(sLink);
  } 
    // Содаем ссылку на видео
    if (HmsRegExMatch(&apos;&lt;iframe src="(.*?)"&apos;, sHtml, sLink)) {
      CreateMediaItem(PodcastItem, mpTitle, sLink);
    }
    
    // Если на странице есть ссылка на трейлер - создаём такую ссылку
    if (HmsRegExMatch(&apos;&lt;iframe class="z4" rel="nofollow" width="700" height="380" src="(.*?)"&apos;, sHtml, sLink)) {
      CreateMediaItem(PodcastItem, &apos;Трейлер&apos;, sLink);
    }
                     
    // Если установлен ключ отображения информационных ссылок - добавляем их
    if (Pos(&apos;--addinfoitems&apos;, mpPodcastParameters)&gt;0) {
      if (Trim(PodcastItem[mpiYear     ])!=&apos;&apos;) CreateInfoItem(&apos;Год выхода&apos;,PodcastItem[mpiYear    ]);
      if (Trim(PodcastItem[mpiGenre    ])!=&apos;&apos;) CreateInfoItem(&apos;Жанр&apos;    , PodcastItem[mpiGenre    ]);
      if (Trim(PodcastItem[mpiCountry  ])!=&apos;&apos;) CreateInfoItem(&apos;Страна&apos;  , PodcastItem[mpiCountry  ]);
      if (Trim(PodcastItem[mpiTranslate])!=&apos;&apos;) CreateInfoItem(&apos;Перевод&apos; , PodcastItem[mpiTranslate]);
      if (Trim(PodcastItem[mpiActor    ])!=&apos;&apos;) CreateInfoItem(&apos;В ролях&apos; , PodcastItem[mpiActor    ]);
      if (Trim(PodcastItem[mpiQuality  ])!=&apos;&apos;) CreateInfoItem(&apos;Качество&apos;, PodcastItem[mpiQuality  ]);
      if (Trim(PodcastItem[mpiDirector ])!=&apos;&apos;) CreateInfoItem(&apos;Режиссер&apos;, PodcastItem[mpiDirector ]);
      if (Trim(PodcastItem[mpiMood     ])!=&apos;&apos;) CreateInfoItem(&apos;Студия&apos;  , PodcastItem[mpiMood     ]);
      if (Trim(PodcastItem[mpiAlbum    ])!=&apos;&apos;) CreateInfoItem(&apos;Премьера&apos;, PodcastItem[mpiAlbum    ]);
      if (Trim(PodcastItem[mpiTimeLength])!=&apos;&apos;) CreateInfoItem(&apos;Время&apos;, PodcastItem[mpiTimeLength ]);
      if (Trim(PodcastItem[mpiIMDBInfo ])!=&apos;&apos;) CreateInfoItem(&apos;IMDB&apos;    , PodcastItem[mpiIMDBInfo ]);
      if (Trim(PodcastItem[mpiRating   ])!=&apos;&apos;) CreateInfoItem(&apos;Kинопоиск&apos; , PodcastItem[mpiRating ]);
    }
    
  }

void QualitySelection() {
  string sData, sLink, sQual = &apos;&apos;; TRegExpr RE; int i;
  // Проверка установленных дополнительных параметров
  HmsRegExMatch(&apos;--quality=(\\w+)&apos;, mpPodcastParameters, sQual);
  bool bQualLog = Pos(&apos;--qualitylog&apos;   , mpPodcastParameters) &gt; 0;
  
  // Если установлен ключ --quality или в настройках подкаста выставлен приоритет выбора качества
  // ------------------------------------------------------------------------
  string sSelectedQual = &apos;&apos;, sMsg, sHeight; int iMinPriority = 99, iPriority; 
  if ((sQual!=&apos;&apos;) || (mpPodcastMediaFormats!=&apos;&apos;)) {
    HmsRegExMatch(&apos;(https?://.*/)&apos;, MediaResourceLink, gsUrlBase);
    sData = HmsDownloadURL(MediaResourceLink, &apos;Referer: &apos;+mpFilePath);
    TStringList QLIST = TStringList.Create();
    // Собираем список ссылок разного качества
    RE = TRegExpr.Create(&apos;RESOLUTION=\\d+x(\\d+).*?[\r\n](.+)$&apos;, PCRE_MULTILINE);
    if (RE.Search(sData)) do {
      sHeight = Format(&apos;%.5d&apos;, [StrToInt(RE.Match(1))]);
      sLink   = HmsExpandLink(RE.Match(2), gsUrlBase);
      QLIST.Values[sHeight] = sLink;
      iPriority = HmsMediaFormatPriority(StrToInt(sHeight), mpPodcastMediaFormats);
      if ((iPriority &gt;= 0) &amp;&amp; (iPriority &lt; iMinPriority)) {
        iMinPriority  = iPriority;
        sSelectedQual = sHeight;
      }
    } while (RE.SearchAgain());
    RE.Free;
    QLIST.Sort();
    if (QLIST.Count &gt; 0) {
      if      (sQual==&apos;low&apos;   ) sSelectedQual = QLIST.Names[0];
      else if (sQual==&apos;medium&apos;) sSelectedQual = QLIST.Names[Round((QLIST.Count-1) / 2)];
      else if (sQual==&apos;high&apos;  ) sSelectedQual = QLIST.Names[QLIST.Count - 1];
      else if (HmsRegExMatch(&apos;(\\d+)&apos;, sQual, sQual)) {
        // Поиск ближайшего значения
        extended minDiff = 999999;
        for (i=0; i &lt; QLIST.Count; i++) {
          extended diff = StrToInt(QLIST.Names[i]) - StrToInt(sQual);
          if (Abs(diff) &lt; minDiff) {
            minDiff = Abs(diff);
            sSelectedQual = QLIST.Names[i];
          }
        }
      }
    }
    if (sSelectedQual != &apos;&apos;) MediaResourceLink = &apos; &apos; + QLIST.Values[sSelectedQual];
    if (bQualLog) {
      sMsg = &apos;Доступное качество: &apos;;
      for (i = 0; i &lt; QLIST.Count; i++) {
        if (i&gt;0) sMsg += &apos;, &apos;;
        sMsg += IntToStr(StrToInt(QLIST.Names[i])); // Обрезаем лидирующие нули
      }
      if (sSelectedQual != &apos;&apos;) sSelectedQual = IntToStr(StrToInt(sSelectedQual));
      else sSelectedQual = &apos;Auto&apos;;
      sMsg += &apos;. Выбрано: &apos; + sSelectedQual;
      HmsLogMessage(1, mpTitle+&apos;. &apos;+sMsg);
    }
    QLIST.Free;
  }
}

///////////////////////////////////////////////////////////////////////////////
// Получение ссылки на медиаресурс в переменную MediaResourceLink
void GetLink() {
  if      (LeftCopy(mpFilePath, 4)==&apos;Info&apos;) ShowVideoInfo();
  else if (LeftCopy(mpFilePath, 3)==&apos;Err&apos; ) VideoMessage(gsPodcastName, mpTitle);
  else if (HmsRegExMatch(&apos;/(serial|video)/.*?/iframe&apos;, mpFilePath, &apos;&apos;)) GetLink_Moonwalk(mpFilePath);
  else if (HmsRegExMatch(&apos;youtube&apos;, mpFilePath, &apos;&apos;)) GetLink_YouTube31(mpFilePath);
  else if (HmsRegExMatch(&apos;vk.com&apos; , mpFilePath, &apos;&apos;)) GetLink_VK(mpFilePath);
  else MediaResourceLink = mpFilePath;
}

///////////////////////////////////////////////////////////////////////////////
//                     Г Л А В Н А Я   П Р О Ц Е Д У Р А                     //
{
  // Проверяем, при каком событии было вызвано выполнение скрипта (не папка ли это)
  if (PodcastItem.IsFolder) {
    
    PodcastItem.DeleteChildItems();

    CreateLinks(); // Это зашли в папку подкаста (фильма) - создаём ссылки

  } else {
    
    GetLink(); // Это запустили фильм - получаем ссылку на медиа-поток    
    // Если в MediaResourceLink пусто, значит получить ссылку не получилось - выводим видео об ошибке
    if (MediaResourceLink==&apos;&apos;) MediaResourceLink = &apos;http://wonky.lostcut.net/vids/podcasterror_hd.mp4&apos;;
  }

}</Value>
    </Property>
    <Property>
      <ID>551</ID>
      <Value>C++Script</Value>
    </Property>
    <Property>
      <ID>571</ID>
      <Value>char gsUrlBase="https://ofx.xyz"; int gnTotalItems=0; TDateTime gTimeStart=Now;

///////////////////////  Создание структуры подкаста  ///////////////////////// 

///////////////////////////////////////////////////////////////////////////////
// Функция создания динамической папки с указанным скриптом
THmsScriptMediaItem CreateDynamicItem(THmsScriptMediaItem prntItem, char sTitle, char sLink, char &amp;sScript=&apos;&apos;) {                                
  THmsScriptMediaItem Folder = prntItem.AddFolder(sLink, false, 32);
  Folder[mpiTitle     ] = sTitle;
  Folder[mpiCreateDate] = VarToStr(IncTime(Now,0,-prntItem.ChildCount,0,0));
  Folder[200] = 5;           // mpiFolderType
  Folder[500] = sScript;     // mpiDynamicScript
  Folder[501] = &apos;C++Script&apos;; // mpiDynamicSyntaxType
  Folder[mpiFolderSortOrder] = -mpiCreateDate;
  return Folder;
}

///////////////////////////////////////////////////////////////////////////////
// Замена в тексте загруженного скрипта значения текстовой переменной
void ReplaceVarValue(char &amp;sText, char sVarName, char sNewVal) {
  char sVal, sVal2;
  if (HmsRegExMatch2("("+sVarName+"\\s*?=.*?&apos;;)", sText, sVal, sVal2)) {
     HmsRegExMatch(sVarName+"\\s*?=\\s*?&apos;(.*)&apos;", sVal, sVal2); 
     sText = ReplaceStr(sText, sVal, ReplaceStr(sVal , sVal2, sNewVal));
  }
}

///////////////////////////////////////////////////////////////////////////////
// Создание папки ПОИСК (с загрузкой скрипта с форума homemediaserver.ru)
void CreateSearchFolder(THmsScriptMediaItem prntItem, char sTitle) {
  char sScript=&apos;&apos;, sLink, sHtml, sRE, sVal; THmsScriptMediaItem Folder;
  
  // Да да, загружаем скрипт с сайта форума HMS
  sHtml = HmsUtf8Decode(HmsDownloadURL(&apos;http://homemediaserver.ru/forum/viewtopic.php?f=15&amp;t=2793&amp;p=17395#p17395&apos;, &apos;&apos;, true));
  HmsRegExMatch(&apos;BeginDynamicSearchScript\\*/(.*?)/\\*EndDynamicSearchScript&apos;, sHtml, sScript, 1, PCRE_SINGLELINE);
  sScript = HmsHtmlToText(sScript, 1251);
  sScript = ReplaceStr(sScript, #160, &apos; &apos;);

  // И меняем значения переменных на свои
  ReplaceVarValue(sScript, &apos;gsSuggestQuery&apos;  , &apos;https://ofx.xyz&amp;text=&apos;);
  ReplaceVarValue(sScript, &apos;gsSuggestRegExpr&apos;, &apos;&lt;span class="searchheading"&gt;(.*?)&lt;/span&gt;&apos;);
  ReplaceVarValue(sScript, &apos;gsSuggestMethod&apos; , &apos;POST&apos;);
  sScript = ReplaceStr(sScript, &apos;gnSuggestNoUTFEnc = 0&apos;, &apos;gnSuggestNoUTFEnc = 1&apos;);
  
  Folder = prntItem.AddFolder(sTitle, true);
  Folder[mpiCreateDate     ] = VarToStr(IncTime(gTimeStart,0,-gnTotalItems,0,0));
  Folder[mpiFolderSortOrder] = "-mpCreateDate";
  gnTotalItems++;
  
  CreateDynamicItem(Folder, &apos;"Набрать текст"&apos;, &apos;-SearchCommands&apos;, sScript);
}

///////////////////////////////////////////////////////////////////////////////
// Создание подкаста или папки
THmsScriptMediaItem CreateItem(THmsScriptMediaItem Parent, char sTitle=&apos;&apos;, char sLink=&apos;&apos;) {
  THmsScriptMediaItem Item; bool bForceFolder = false;

  if (sLink==&apos;&apos;) { sLink = sTitle; bForceFolder = true; }
  else             sLink = HmsExpandLink(sLink, gsUrlBase);
  
  Item = Parent.AddFolder(sLink, bForceFolder);
  Item[mpiTitle     ] = sTitle;
  Item[mpiCreateDate] = VarToStr(IncTime(gTimeStart,0,-gnTotalItems,0,0));
  Item[mpiFolderSortOrder] = -mpiCreateDate;
  gnTotalItems++;
  return Item;
}

///////////////////////////////////////////////////////////////////////////////
// ---------------------  M A I N  P R O C E D U R E  -------------------------
{
  THmsScriptMediaItem Folder, Item;

  FolderItem.DeleteChildItems();

  CreateSearchFolder (FolderItem, &apos;00. Поиск&apos;);
  Folder = CreateItem(FolderItem, &apos;01. Последние поступления&apos;, &apos;/&apos;);
  Folder[mpiPodcastParameters] = &apos;--group=alph&apos;;
  
  Folder = CreateItem(FolderItem, &apos;02. Категории&apos;);
    CreateItem(Folder, &apos;Боевики&apos;     , "/boevik/");
    CreateItem(Folder, &apos;Комедии&apos;     , "/komedia/");
    CreateItem(Folder, &apos;Катастрофа&apos;  , "/katastrofa/");
    CreateItem(Folder, &apos;Фантастика&apos;  , "/fantastika/");
    CreateItem(Folder, &apos;Мелодрама&apos;   , "/melodrama/");
    CreateItem(Folder, &apos;Детективы&apos;   , "/detectiv/");
    CreateItem(Folder, &apos;Триллеры&apos;    , "/triller/");
    CreateItem(Folder, &apos;Фэнтези&apos;     , "/fentezi/");
    CreateItem(Folder, &apos;Драма&apos;       , "/drama/");
    CreateItem(Folder, &apos;Ужасы&apos;       , "/yjasu/");
    CreateItem(Folder, &apos;Аниме&apos;       , "/anime/");
    Folder[mpiPodcastParameters] = &apos;--group=alph&apos;;
   
    Folder = CreateItem(FolderItem, &apos;03. Советское кино&apos; ,&apos;/sssr/&apos;);
    Folder[mpiPodcastParameters] = &apos;--group=alph&apos;;
    Folder = CreateItem(FolderItem, &apos;04. Короткометражка&apos;,&apos;/korotkometrazhka/&apos;);
    Folder[mpiPodcastParameters] = &apos;--group=alph&apos;;
    Folder = CreateItem(FolderItem, &apos;05. Мультфильмы&apos;    ,&apos;/multfilms/&apos;);
    Folder[mpiPodcastParameters] = &apos;--group=alph&apos;;
    Folder = CreateItem(FolderItem, &apos;06. Экранки&apos;        ,&apos;/cam/&apos;);
    Folder[mpiPodcastParameters] = &apos;--group=alph&apos;;
    Folder = CreateItem(FolderItem, &apos;07. Новинки в кино&apos; ,&apos;/novinki/&apos;);
    Folder[mpiPodcastParameters] = &apos;--group=alph&apos;;
    Folder = CreateItem(FolderItem, &apos;08. Документальный&apos; ,&apos;/documental/&apos;);
    Folder[mpiPodcastParameters] = &apos;--group=alph&apos;;
    Folder = CreateItem(FolderItem, &apos;09. Эротика&apos;        ,&apos;/erotik/&apos;);
    Folder[mpiPodcastParameters] = &apos;--group=alph&apos;;
    Folder = CreateItem(FolderItem, &apos;10. Исторический&apos;   ,&apos;/istoric/&apos;);
    Folder[mpiPodcastParameters] = &apos;--group=alph&apos;;
  
  
  HmsLogMessage(1, mpTitle+&apos;: Создано ссылок - &apos;+IntToStr(gnTotalItems));
}</Value>
    </Property>
    <Property>
      <ID>572</ID>
      <Value>C++Script</Value>
    </Property>
  </Properties>
  <ChildItems>
    <Item>
      <ClassID>51</ClassID>
      <ItemID>630f11abfa1fb60e7aae8a24e11e264f</ItemID>
      <ItemPath>00. Поиск</ItemPath>
      <ParentID>6591a5c8-cebd-4e3d-813c-7d4d05b538e0</ParentID>
      <Properties>
        <Property>
          <ID>515</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>512</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>532</ID>
          <Value>1</Value>
        </Property>
        <Property>
          <ID>700</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>553</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>42</ID>
          <Value>3</Value>
        </Property>
        <Property>
          <ID>35</ID>
          <Value>42918,6461111111</Value>
        </Property>
        <Property>
          <ID>215</ID>
          <Value>-mpCreateDate</Value>
        </Property>
        <Property>
          <ID>93</ID>
          <Value>42918,646145625</Value>
        </Property>
        <Property>
          <ID>701</ID>
          <Value>-1</Value>
        </Property>
        <Property>
          <ID>702</ID>
          <Value>-1</Value>
        </Property>
        <Property>
          <ID>517</ID>
          <Value>578-720,722-1080,482-576,402-480,322-400,202-320,0-200</Value>
        </Property>
        <Property>
          <ID>518</ID>
          <Value>0</Value>
        </Property>
        <Property>
          <ID>531</ID>
          <Value>Нет скрипта</Value>
        </Property>
        <Property>
          <ID>522</ID>
          <Value>0</Value>
        </Property>
        <Property>
          <ID>570</ID>
          <Value>0</Value>
        </Property>
        <Property>
          <ID>245</ID>
          <Value>630f11abfa1fb60e7aae8a24e11e264f</Value>
        </Property>
      </Properties>
      <ChildItems>
        <Item>
          <ClassID>32</ClassID>
          <ItemID>290d864e81195c54ef4032ba8e024224</ItemID>
          <ItemPath>-SearchCommands</ItemPath>
          <ParentID>630f11abfa1fb60e7aae8a24e11e264f</ParentID>
          <Properties>
            <Property>
              <ID>515</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>512</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>532</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>700</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>553</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>42</ID>
              <Value>3</Value>
            </Property>
            <Property>
              <ID>4</ID>
              <Value>"Набрать текст"</Value>
            </Property>
            <Property>
              <ID>35</ID>
              <Value>42918,6454282407</Value>
            </Property>
            <Property>
              <ID>200</ID>
              <Value>5</Value>
            </Property>
            <Property>
              <ID>500</ID>
              <Value>// Var 07.01.2014
int mpiFolderType        = 200;
int mpiDynamicScript     = 500;
int mpiDynamicSyntaxType = 501;
int mpiPreviousItemID    = 200104;
int mpiDoNothing         = 201100;
char gsSpace           = &apos;Пробел&apos;;
char gsDelLastChar     = &apos;Удалить последний символ&apos;;
char gsClearSearch     = &apos;Очистить текст поиска&apos;;
char gsClearHystoryIn  = &apos;Очистить историю поиска в папке "%s"&apos;;
char gsMsgClearHistory = &apos;История поиска в папке "%s" очищена&apos;;
char gsMsgTextSaved    = &apos;Подкаст "%s" добавлен в "%s"&apos;;
char gsMsgNothingSaved = &apos;Текст поиска не набран! Добавлять нечего.&apos;;
char gsMsgSearchText   = &apos;Текст поиска: %s&apos;;
char gsAddSearchTo     = &apos;Добавить в папку "%s"&apos;;
char gsSuggestQuery    = &apos;http://www.google.ru/complete/search?sclient=psy-ab&amp;q=&apos;;
char gsSuggestResultCut= &apos;&apos;;
char gsSuggestRegExpr  = &apos;\\["(.*?)",&apos;;
char gsSuggestMethod   = &apos;GET&apos;;
int  gnSuggestNoUTFEnc = 0;
char gsSuggestMessage  = &apos;Вариант: &apos;;
int gnTotalItems=0; TDateTime gTimeStart = Now; char gsTextSearch, gsMsg=&apos;&apos;;
THmsScriptMediaItem goRootItem, goCmdItem;
// ------------------------------------------ Создание папок команд поиска ----
void CreateSearchCommands() {
  int i; char sText; THmsScriptMediaItem Item;
  CreateDynamicItem(FolderItem, &apos;#&apos;,   &apos;-SearchCreateChars=From:32To:58&apos;);
  CreateDynamicItem(FolderItem, &apos;A-Z&apos;, &apos;-SearchCreateChars=From:65To:91&apos;);
  CreateDynamicItem(FolderItem, &apos;А-Я&apos;, &apos;-SearchCreateChars=From:192To:224&apos;);
  CreateDynamicItem(FolderItem, gsClearSearch, &apos;-SearchCmd=ClearSearchText&apos;);
  // Создание команды добавления в корневую папку поиска
  CreateDynamicItem(FolderItem, Format(gsAddSearchTo, [goRootItem[mpiTitle]]), &apos;-SearchCmd=SaveSearchText&apos;);
  // Создание команд добавления в папки, находящиеся в корневой, если поле "Файл" (mpiFilePath) у них пустое
  for (i=0; i&lt;goRootItem.ChildCount; i++) {
    Item = goRootItem.ChildItems[i];
    if (!Item.IsFolder || (Item[mpiFilePath]!=&apos;&apos;)) continue;
    CreateDynamicItem(FolderItem, Format(gsAddSearchTo, [Item[mpiTitle]]), &apos;-SaveSearchTextTo=&apos;+Item.ItemID);
  }
  // Создание команды очистки истории в корневой папке поиска
  CreateDynamicItem(FolderItem, Format(gsClearHystoryIn, [goRootItem[mpiTitle]]), &apos;-SearchCmd=ClearSearchHistory&apos;);
  // Создание команд очистки истории в папках, которые наодятся в корневой
  for (i=0; i&lt;goRootItem.ChildCount; i++) {
    Item = goRootItem.ChildItems[i];
    if (!Item.IsFolder || (Item[mpiFilePath]!=&apos;&apos;)) continue;
    CreateDynamicItem(FolderItem, Format(gsClearHystoryIn, [Item[mpiTitle]]), &apos;-ClearSearchHistoryIn=&apos;+Item.ItemID);
  }
  // Создание ссылки, информирующей о текущем набранном тексте поиска
  sText = Format(gsMsgSearchText, [gsTextSearch]);
  Item = HmsCreateMediaItem(sText, goCmdItem.ItemID);
  Item[mpiTitle    ] = sText;
  Item[mpiThumbnail] = &apos;http://wonky.lostcut.net/icons/search-icon1.jpg&apos;;
}
// ---------------------------- Добавление подкаста с именем текста поиска ----
void AddPodcastSearch(THmsScriptMediaItem prntItem) {
  THmsScriptMediaItem Item;
  if (Trim(gsTextSearch)==&apos;&apos;) {gsMsg = gsMsgNothingSaved; return;}
  if (LowerCase(gsTextSearch)==gsTextSearch) gsTextSearch = NameCase(gsTextSearch);
  Item = prntItem.AddFolder(gsTextSearch, false);
  Item[mpiFilePath ] = Format(&apos;search="%s"&apos;, [gsTextSearch]);
  Item[mpiTitle    ] = gsTextSearch;
  HmsDatabaseAutoSave(false);
  gsMsg = Format(gsMsgTextSaved, [gsTextSearch, prntItem[mpiTitle]]);
  gsTextSearch = &apos;&apos;;
}
// --------- Функция создания динамической папки с унаследованным скриптом ----
void CreateDynamicItem(THmsScriptMediaItem prntItem, char sTitle, char sLink) {
char s; THmsScriptMediaItem Folder;
  if (Trim(sTitle)==&apos;&apos;) sTitle = gsSpace;
  Folder = prntItem.AddFolder(sLink, true);
  Folder[mpiTitle            ] = sTitle;
  Folder[mpiCreateDate       ] = VarToStr(IncTime(gTimeStart,0,-gnTotalItems,0,0)); gnTotalItems++;
  Folder[mpiFolderType       ] = prntItem[mpiFolderType];
  Folder[mpiDynamicScript    ] = prntItem[mpiDynamicScript];
  Folder[mpiDynamicSyntaxType] = prntItem[mpiDynamicSyntaxType];
  Folder[mpiFolderSortOrder  ] = prntItem[mpiFolderSortOrder];
}
// ----------------------------  MAIN PROCEDURE  ------------------------------
{
  int i, nCnt; char sCh, sCh1, sCh2, sText; THmsScriptMediaItem Item;
  char s, sUrlServer = &apos;&apos;, sRequestPage = &apos;/&apos;, sPostData = &apos;&apos;, sHeaders = &apos;&apos;;
  if (LeftCopy(mpFilePath, 1) != &apos;-&apos;) return; // Если это не команда - то и не обрабатываем
  // Поиск корневого каталога поиска (папки, которая содержит динамическую папку с путем "-SearchCommands")
  goRootItem = FolderItem; goCmdItem = FolderItem;
  while ((goRootItem.ItemParent != HmsDatabaseRootItem) &amp;&amp; (goRootItem.ItemParent != nil)) {
    if (goRootItem[mpiFilePath] == &apos;-SearchCommands&apos;) {goCmdItem=goRootItem; goRootItem=goCmdItem.ItemParent; break;}
    goRootItem = goRootItem.ItemParent;
  }
  // Если это повторный вызов, смены папки не произошло - ничего не делаем
  if ((FolderItem.ItemID==goRootItem[mpiPreviousItemID]) &amp;&amp; !DebugMode &amp;&amp; (FolderItem!=goCmdItem)) return;
  FolderItem.DeleteChildItems(); goRootItem[mpiPreviousItemID] = FolderItem.ItemID;
  gsTextSearch = HmsGetUserSearchText(); // Получаем текущее значение текста поиска
  // ---- Проверяем команды - по значению в mpFilePath ----
  if (goRootItem[mpiDoNothing]==&apos;1&apos;) {   // Флаг "Ничего не делать" - например, при возврате
    goRootItem[mpiDoNothing] = &apos;&apos;;       //   в команду набирания буквы из подпапки варианта
  } else if (HmsRegExMatch(&apos;-SearchCommands&apos;, mpFilePath, sCh1)) {              // Создание корневых команд поиска
    CreateSearchCommands(); return;
  } else if (HmsRegExMatch(&apos;-SearchChar=(\\d+)&apos;, mpFilePath, sCh1)) {           // Добавление буквы (символа) к набираемому тексту поиска
    gsTextSearch += Chr(StrToInt(sCh1));
  } else if (HmsRegExMatch(&apos;-SetSearchText=(.*)&apos;, mpFilePath, gsTextSearch)) {  // Назначить текст поиска значением варианта подсказки
    goRootItem[mpiDoNothing] = &apos;1&apos;; gsSuggestQuery = &apos;&apos;; // включаем флаг не выполнять команду при возврате из этой папки
  } else if (HmsRegExMatch(&apos;-SaveSearchTextTo=(.*)&apos;, mpFilePath, sCh1)) {       // Добавление в папку Х. Поиск этой папки по ItemID.
    Item = goRootItem; // Ищем папку с ItemID равному идентификатору, переданному в mpFilePath
    for (i=0; i&lt;goRootItem.ChildCount; i++) {
      if (goRootItem.ChildItems[i].ItemID==sCh1) {Item = goRootItem.ChildItems[i]; break;}
    }
    AddPodcastSearch(Item); // и добавляем в найденную папку подкаст текстом поиска
  } else if (HmsRegExMatch(&apos;-ClearSearchHistoryIn=(.*)&apos;, mpFilePath, sCh1)) {   // Очистка истории (добавленных ранее) поисковых значений
    Item = goRootItem; // Ищем папку с ItemID равному идентификатору, переданному в mpFilePath
    for (i=0; i&lt;goRootItem.ChildCount; i++) {
      if (goRootItem.ChildItems[i].ItemID==sCh1) {Item = goRootItem.ChildItems[i]; break;}
    }
    for(i=0; i&lt;Item.ChildCount; i++) { // Удаляем все элементы с начинающимся словом &apos;search&apos; в поле mpiFilePath
      if (LeftCopy(Item.ChildItems[i].Properties[mpiFilePath], 6)==&apos;search&apos;) {Item.ChildItems[i].Delete();i--;}
    }
    gsMsg = Format(gsMsgClearHistory, [Item[mpiTitle]]); // вывод сообщения, что история очищена
  } else if (HmsRegExMatch(&apos;-SearchCmd=(\\w+)&apos;,   mpFilePath, sCh1)) {
    if      (sCh1==&apos;DeleteLastChar&apos; ) gsTextSearch = LeftCopy(gsTextSearch, Length(gsTextSearch)-1); // Удаление последнего символа
    else if (sCh1==&apos;SaveSearchText&apos; ) AddPodcastSearch(goRootItem);             // Добавить текст поиска в корневую папку
    else if (sCh1==&apos;ClearSearchText&apos;) gsTextSearch = &apos;&apos;;                        // Очистка текста поиска
    else if (sCh1==&apos;ClearSearchHistory&apos;) {                                      // Очистка истории (добавленных значений поиска)
      for(i=0; i&lt;goRootItem.ChildCount; i++) {
        Item = goRootItem.ChildItems[i]; // Ищем все элементы, у которых значение mpiFilePath начиначется с &apos;search&apos;
        if (LeftCopy(Item[mpiFilePath], 6)==&apos;search&apos;) {goRootItem.ChildItems[i].Delete();i--;}
      }
      gsMsg = Format(gsMsgClearHistory, [goRootItem[mpiTitle]]);
    }
  } else if (HmsRegExMatch2(&apos;-SearchCreateChars=From:(\\d+)To:(\\d+)&apos;, mpFilePath, sCh1, sCh2)) { // Создание списка букв/символов
    CreateDynamicItem(FolderItem, gsDelLastChar, &apos;-SearchCmd=DeleteLastChar Suggestions&apos;); // В начало - команда удаления символа
    CreateDynamicItem(FolderItem, &apos; &apos;, &apos;-SearchChar=32 Suggestions&apos;); // Пробел
    for (i= StrToInt(sCh1); i&lt;StrToInt(sCh2); i++) CreateDynamicItem(FolderItem, Chr(i), &apos;-SearchChar=&apos;+IntToStr(i)+&apos; Suggestions&apos;);
    // слово "Suggestions" добавлено к значению mpiFilePath тек команд, в которых возможно использование подсказок
  }
  else return; // Если неизвестная нам команда - просто выходим
  HmsSetUserSearchText(gsTextSearch); // Устанавливаем значение текста поиска
  Item = HmsCreateMediaItem(&apos;-command=none&apos;, FolderItem.ItemID);
  if (gsMsg==&apos;&apos;) { // Если сообщения небыло - просто выводим ссылку с текущим значением набранного текста
    Item[mpiThumbnail] = &apos;http://wonky.lostcut.net/icons/search-icon1.jpg&apos;;
    Item[mpiFilePath ] = Format(gsMsgSearchText, [gsTextSearch]);
  } else {         // Выводим сообщение
    Item[mpiThumbnail] = &apos;http://wonky.lostcut.net/icons/ok.png&apos;;
    Item[mpiFilePath ] = gsMsg;
  }
  Item = HmsCreateMediaItem(&apos;-command=none&apos;, FolderItem.ItemParent.ItemID);     // В родительской папке (выше) обновляем информацию о текущем значении текста
  Item[mpiFilePath]  = Format(gsMsgSearchText, [gsTextSearch]);
  Item[mpiThumbnail] = &apos;http://wonky.lostcut.net/icons/search-icon1.jpg&apos;;
  Item = HmsCreateMediaItem(&apos;-command=none&apos;, goCmdItem.ItemID);                 // Также в папке, содержащую главные команды поиска
  Item[mpiFilePath]  = Format(gsMsgSearchText, [gsTextSearch]);
  Item[mpiThumbnail] = &apos;http://wonky.lostcut.net/icons/search-icon1.jpg&apos;;
  // Suggestions ------ Блок работы с подсказками -------
  if ((gsSuggestQuery!=&apos;&apos;) &amp;&amp; (Pos(&apos;Suggestions&apos;, mpFilePath)&gt;0) &amp;&amp; (Length(gsTextSearch)&gt;1)) {
    sText = gsTextSearch; if (gnSuggestNoUTFEnc==0) sText = HmsUtf8Encode(sText); // Если не указано не кодировать в UTF - кодируем
    sText = HmsHttpEncode(sText);
    // Если есть ключ &lt;TEXT&gt; в запросе - заменяем его на значение набранного текста, иначе просто добавляем в конец
    if (Pos(&apos;&lt;TEXT&gt;&apos;, gsSuggestQuery)&gt;0) gsSuggestQuery = ReplaceStr(gsSuggestQuery, &apos;&lt;TEXT&gt;&apos;, sText);
    else gsSuggestQuery = gsSuggestQuery + sText;
    HmsRegExMatch2(&apos;https?://(.*?)(/.*)&apos;, gsSuggestQuery, sUrlServer, sRequestPage);
    if (gsSuggestMethod==&apos;POST&apos;) HmsRegExMatch2(&apos;^(.*?)\\?(.*)&apos;, sRequestPage, sRequestPage, sPostData);
    sHeaders = &apos;http://&apos;+sUrlServer+&apos;/\r\n&apos;+
               &apos;Accept-Encoding: gzip, deflate\r\n&apos;+
               &apos;User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko/20100101 Firefox/13.0\r\n&apos;+
               &apos;Connection: Keep-Alive\r\n&apos;+
               &apos;Accept: application/json, text/javascript, */*; q=0.01\r\n&apos;;    // Для включения возможности gzip в запросах
    sText = HmsSendRequestEx(sUrlServer, sRequestPage, gsSuggestMethod, &apos;application/x-www-form-urlencoded; Charset=UTF-8&apos;, sHeaders, sPostData, 80, 0, &apos;&apos;, true);
    sText = HmsUtf8Decode(sText);
    if (gsSuggestResultCut!=&apos;&apos;) HmsRegExMatch(gsSuggestResultCut, sText, sText);// Если есть выражение обрезки - обрезаем
    sText = HmsJsonDecode(sText); TRegExpr t = TRegExpr.Create(&apos;(&lt;[^&gt;]+&gt;)&apos;);    // Избавляемся от тегов в середине слов подсказки
    TRegExpr reSearch = TRegExpr.Create(gsSuggestRegExpr, PCRE_SINGLELINE);
    if (reSearch.Search(sText)) do {
      s = reSearch.Match;
      if (t.Search(s)) do s=ReplaceStr(s, t.Match, &apos;&apos;); while (t.SearchAgain());// (функция HmsHtmlToText не подходит т.к. ставит пробел в середине слова)
      if (HmsRegExMatch(&apos;^(.*?)[/\\(\\|]&apos;, s, sCh)) {                           // Обрезаем подсказку до знаков /, ( или |
        if (Pos(LowerCase(gsTextSearch), LowerCase(sCh))&gt;0) s = sCh;            // Если после этого в подсказке встречается набранный текст - то так и оставляем
      }
      if (LowerCase(s)==s) s = NameCase(s);                                     // Если подсказки - все маленькие буквы, делаем NameCase
      // Если в подсказке больше одного слова - дополнительно создаём сначала подсказки из слов, которые содержат набранный текст (выделяем слова отдельно)
      if (WordCount(s, &apos; &apos;)&gt;1) {
        nCnt = WordCount(s, &apos; &apos;);
        for (i=1; i&lt;=nCnt; i++) {
          sCh=ExtractWord(i, s, &apos; &apos;); if (Trim(sCh)==&apos;&apos;) continue;
          if (Pos(LowerCase(gsTextSearch), LowerCase(sCh))&lt;1) continue;
          if (LowerCase(gsTextSearch)==LowerCase(sCh)) continue;
          sCh = ReplaceStr(sCh, &apos;:&apos;, &apos;&apos;); sCh=ReplaceStr(sCh, &apos;\\&apos;, &apos;&apos;);
          CreateDynamicItem(FolderItem, gsSuggestMessage+sCh, &apos;-SetSearchText=&apos;+sCh);
        }
      }
      // Создаём папку с предложением варианта (подсказку)
      if (LowerCase(s)!=LowerCase(gsTextSearch)) CreateDynamicItem(FolderItem, gsSuggestMessage+s, &apos;-SetSearchText=&apos;+s);
      if (gnTotalItems&gt;100) break; // Ограничиваем количество создаваемых элементов = 100
    } while (reSearch.SearchAgain());
  }
  HmsIncSystemUpdateID(); // Говорим устройству об обновлении содержания
}</Value>
            </Property>
            <Property>
              <ID>501</ID>
              <Value>C++Script</Value>
            </Property>
            <Property>
              <ID>215</ID>
              <Value>-mpCreateDate</Value>
            </Property>
            <Property>
              <ID>93</ID>
              <Value>42918,646145625</Value>
            </Property>
            <Property>
              <ID>245</ID>
              <Value>290d864e81195c54ef4032ba8e024224</Value>
            </Property>
          </Properties>
        </Item>
      </ChildItems>
    </Item>
    <Item>
      <ClassID>53</ClassID>
      <ItemID>f978010cefca2c91bee58d18101c997d</ItemID>
      <ItemPath>https://ofx.xyz/</ItemPath>
      <ParentID>6591a5c8-cebd-4e3d-813c-7d4d05b538e0</ParentID>
      <Properties>
        <Property>
          <ID>515</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>512</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>532</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>700</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>553</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>42</ID>
          <Value>3</Value>
        </Property>
        <Property>
          <ID>4</ID>
          <Value>01. Последние поступления</Value>
        </Property>
        <Property>
          <ID>35</ID>
          <Value>42918,6454166667</Value>
        </Property>
        <Property>
          <ID>215</ID>
          <Value>-35</Value>
        </Property>
        <Property>
          <ID>527</ID>
          <Value>--group=alph</Value>
        </Property>
        <Property>
          <ID>93</ID>
          <Value>42918,646145625</Value>
        </Property>
        <Property>
          <ID>525</ID>
          <Value>43009,8123512037</Value>
        </Property>
      </Properties>
    </Item>
    <Item>
      <ClassID>51</ClassID>
      <ItemID>221b2328d04a9d99730a9a2edadf61ae</ItemID>
      <ItemPath>02. Категории</ItemPath>
      <ParentID>6591a5c8-cebd-4e3d-813c-7d4d05b538e0</ParentID>
      <Properties>
        <Property>
          <ID>515</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>512</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>532</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>700</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>553</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>42</ID>
          <Value>3</Value>
        </Property>
        <Property>
          <ID>35</ID>
          <Value>42918,6447222222</Value>
        </Property>
        <Property>
          <ID>215</ID>
          <Value>-35</Value>
        </Property>
        <Property>
          <ID>527</ID>
          <Value>--group=alph</Value>
        </Property>
        <Property>
          <ID>93</ID>
          <Value>42918,646145625</Value>
        </Property>
      </Properties>
      <ChildItems>
        <Item>
          <ClassID>53</ClassID>
          <ItemID>59726aa6f1d6fcf0ae86dcb8ab6fed3d</ItemID>
          <ItemPath>https://ofx.xyz/boevik/</ItemPath>
          <ParentID>221b2328d04a9d99730a9a2edadf61ae</ParentID>
          <Properties>
            <Property>
              <ID>515</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>512</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>532</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>700</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>553</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>42</ID>
              <Value>3</Value>
            </Property>
            <Property>
              <ID>4</ID>
              <Value>Боевики</Value>
            </Property>
            <Property>
              <ID>35</ID>
              <Value>42918,6440277778</Value>
            </Property>
            <Property>
              <ID>215</ID>
              <Value>-35</Value>
            </Property>
            <Property>
              <ID>93</ID>
              <Value>42918,646145625</Value>
            </Property>
          </Properties>
        </Item>
        <Item>
          <ClassID>53</ClassID>
          <ItemID>84c7156e50d578a97fa59cf317b83545</ItemID>
          <ItemPath>https://ofx.xyz/komedia/</ItemPath>
          <ParentID>221b2328d04a9d99730a9a2edadf61ae</ParentID>
          <Properties>
            <Property>
              <ID>515</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>512</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>532</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>700</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>553</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>42</ID>
              <Value>3</Value>
            </Property>
            <Property>
              <ID>4</ID>
              <Value>Комедии</Value>
            </Property>
            <Property>
              <ID>35</ID>
              <Value>42918,6433333333</Value>
            </Property>
            <Property>
              <ID>215</ID>
              <Value>-35</Value>
            </Property>
            <Property>
              <ID>93</ID>
              <Value>42918,646145625</Value>
            </Property>
          </Properties>
        </Item>
        <Item>
          <ClassID>53</ClassID>
          <ItemID>a6da4b8330c4949395e30e5c1bc78edd</ItemID>
          <ItemPath>https://ofx.xyz/katastrofa/</ItemPath>
          <ParentID>221b2328d04a9d99730a9a2edadf61ae</ParentID>
          <Properties>
            <Property>
              <ID>515</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>512</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>532</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>700</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>553</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>42</ID>
              <Value>3</Value>
            </Property>
            <Property>
              <ID>4</ID>
              <Value>Катастрофа</Value>
            </Property>
            <Property>
              <ID>35</ID>
              <Value>42918,6426388889</Value>
            </Property>
            <Property>
              <ID>215</ID>
              <Value>-35</Value>
            </Property>
            <Property>
              <ID>93</ID>
              <Value>42918,646145625</Value>
            </Property>
          </Properties>
        </Item>
        <Item>
          <ClassID>53</ClassID>
          <ItemID>8fda22fe64de22566bc84675684fe4f5</ItemID>
          <ItemPath>https://ofx.xyz/fantastika/</ItemPath>
          <ParentID>221b2328d04a9d99730a9a2edadf61ae</ParentID>
          <Properties>
            <Property>
              <ID>515</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>512</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>532</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>700</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>553</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>42</ID>
              <Value>3</Value>
            </Property>
            <Property>
              <ID>4</ID>
              <Value>Фантастика</Value>
            </Property>
            <Property>
              <ID>35</ID>
              <Value>42918,6419444444</Value>
            </Property>
            <Property>
              <ID>215</ID>
              <Value>-35</Value>
            </Property>
            <Property>
              <ID>93</ID>
              <Value>42918,646145625</Value>
            </Property>
          </Properties>
        </Item>
        <Item>
          <ClassID>53</ClassID>
          <ItemID>3101bc7d18366ec648ceb3dd0e3ef647</ItemID>
          <ItemPath>https://ofx.xyz/melodrama/</ItemPath>
          <ParentID>221b2328d04a9d99730a9a2edadf61ae</ParentID>
          <Properties>
            <Property>
              <ID>515</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>512</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>532</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>700</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>553</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>42</ID>
              <Value>3</Value>
            </Property>
            <Property>
              <ID>4</ID>
              <Value>Мелодрама</Value>
            </Property>
            <Property>
              <ID>35</ID>
              <Value>42918,64125</Value>
            </Property>
            <Property>
              <ID>215</ID>
              <Value>-35</Value>
            </Property>
            <Property>
              <ID>93</ID>
              <Value>42918,646145625</Value>
            </Property>
          </Properties>
        </Item>
        <Item>
          <ClassID>53</ClassID>
          <ItemID>39a4742ab47e45e099227963f1170623</ItemID>
          <ItemPath>https://ofx.xyz/detectiv/</ItemPath>
          <ParentID>221b2328d04a9d99730a9a2edadf61ae</ParentID>
          <Properties>
            <Property>
              <ID>515</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>512</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>532</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>700</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>553</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>42</ID>
              <Value>3</Value>
            </Property>
            <Property>
              <ID>4</ID>
              <Value>Детективы</Value>
            </Property>
            <Property>
              <ID>35</ID>
              <Value>42918,6405555556</Value>
            </Property>
            <Property>
              <ID>215</ID>
              <Value>-35</Value>
            </Property>
            <Property>
              <ID>93</ID>
              <Value>42918,646145625</Value>
            </Property>
          </Properties>
        </Item>
        <Item>
          <ClassID>53</ClassID>
          <ItemID>7410d350477081f01d07123f16e0e689</ItemID>
          <ItemPath>https://ofx.xyz/triller/</ItemPath>
          <ParentID>221b2328d04a9d99730a9a2edadf61ae</ParentID>
          <Properties>
            <Property>
              <ID>515</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>512</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>532</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>700</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>553</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>42</ID>
              <Value>3</Value>
            </Property>
            <Property>
              <ID>4</ID>
              <Value>Триллеры</Value>
            </Property>
            <Property>
              <ID>35</ID>
              <Value>42918,6398611111</Value>
            </Property>
            <Property>
              <ID>215</ID>
              <Value>-35</Value>
            </Property>
            <Property>
              <ID>93</ID>
              <Value>42918,646145625</Value>
            </Property>
          </Properties>
        </Item>
        <Item>
          <ClassID>53</ClassID>
          <ItemID>99f10d4030b01d98b84c83600c89d1b5</ItemID>
          <ItemPath>https://ofx.xyz/fentezi/</ItemPath>
          <ParentID>221b2328d04a9d99730a9a2edadf61ae</ParentID>
          <Properties>
            <Property>
              <ID>515</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>512</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>532</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>700</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>553</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>42</ID>
              <Value>3</Value>
            </Property>
            <Property>
              <ID>4</ID>
              <Value>Фэнтези</Value>
            </Property>
            <Property>
              <ID>35</ID>
              <Value>42918,6391666667</Value>
            </Property>
            <Property>
              <ID>215</ID>
              <Value>-35</Value>
            </Property>
            <Property>
              <ID>93</ID>
              <Value>42918,646145625</Value>
            </Property>
          </Properties>
        </Item>
        <Item>
          <ClassID>53</ClassID>
          <ItemID>384c094a5485266032e9bd90c83ea17f</ItemID>
          <ItemPath>https://ofx.xyz/drama/</ItemPath>
          <ParentID>221b2328d04a9d99730a9a2edadf61ae</ParentID>
          <Properties>
            <Property>
              <ID>515</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>512</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>532</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>700</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>553</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>42</ID>
              <Value>3</Value>
            </Property>
            <Property>
              <ID>4</ID>
              <Value>Драма</Value>
            </Property>
            <Property>
              <ID>35</ID>
              <Value>42918,6384722222</Value>
            </Property>
            <Property>
              <ID>215</ID>
              <Value>-35</Value>
            </Property>
            <Property>
              <ID>93</ID>
              <Value>42918,646145625</Value>
            </Property>
          </Properties>
        </Item>
        <Item>
          <ClassID>53</ClassID>
          <ItemID>c98fc9516d2b279a34d2f800a0b114b3</ItemID>
          <ItemPath>https://ofx.xyz/yjasu/</ItemPath>
          <ParentID>221b2328d04a9d99730a9a2edadf61ae</ParentID>
          <Properties>
            <Property>
              <ID>515</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>512</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>532</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>700</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>553</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>42</ID>
              <Value>3</Value>
            </Property>
            <Property>
              <ID>4</ID>
              <Value>Ужасы</Value>
            </Property>
            <Property>
              <ID>35</ID>
              <Value>42918,6377777778</Value>
            </Property>
            <Property>
              <ID>215</ID>
              <Value>-35</Value>
            </Property>
            <Property>
              <ID>93</ID>
              <Value>42918,646145625</Value>
            </Property>
          </Properties>
        </Item>
        <Item>
          <ClassID>53</ClassID>
          <ItemID>cbf5f6518a1beff37562648239b20e3c</ItemID>
          <ItemPath>https://ofx.xyz/anime/</ItemPath>
          <ParentID>221b2328d04a9d99730a9a2edadf61ae</ParentID>
          <Properties>
            <Property>
              <ID>515</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>512</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>532</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>700</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>553</ID>
              <Value>2</Value>
            </Property>
            <Property>
              <ID>42</ID>
              <Value>3</Value>
            </Property>
            <Property>
              <ID>4</ID>
              <Value>Аниме</Value>
            </Property>
            <Property>
              <ID>35</ID>
              <Value>42918,6370833333</Value>
            </Property>
            <Property>
              <ID>215</ID>
              <Value>-35</Value>
            </Property>
            <Property>
              <ID>93</ID>
              <Value>42918,646145625</Value>
            </Property>
          </Properties>
        </Item>
      </ChildItems>
    </Item>
    <Item>
      <ClassID>53</ClassID>
      <ItemID>5496c888828e88b70474654e0d69da8b</ItemID>
      <ItemPath>https://ofx.xyz/sssr/</ItemPath>
      <ParentID>6591a5c8-cebd-4e3d-813c-7d4d05b538e0</ParentID>
      <Properties>
        <Property>
          <ID>515</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>512</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>532</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>700</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>553</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>42</ID>
          <Value>3</Value>
        </Property>
        <Property>
          <ID>4</ID>
          <Value>03. Советское кино</Value>
        </Property>
        <Property>
          <ID>35</ID>
          <Value>42918,6363888889</Value>
        </Property>
        <Property>
          <ID>215</ID>
          <Value>-35</Value>
        </Property>
        <Property>
          <ID>527</ID>
          <Value>--group=alph</Value>
        </Property>
        <Property>
          <ID>93</ID>
          <Value>42918,646145625</Value>
        </Property>
        <Property>
          <ID>525</ID>
          <Value>43009,812410463</Value>
        </Property>
      </Properties>
    </Item>
    <Item>
      <ClassID>53</ClassID>
      <ItemID>62e36fc86b1e4ee2cbb8fb01ccefc3d4</ItemID>
      <ItemPath>https://ofx.xyz/korotkometrazhka/</ItemPath>
      <ParentID>6591a5c8-cebd-4e3d-813c-7d4d05b538e0</ParentID>
      <Properties>
        <Property>
          <ID>515</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>512</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>532</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>700</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>553</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>42</ID>
          <Value>3</Value>
        </Property>
        <Property>
          <ID>4</ID>
          <Value>04. Короткометражка</Value>
        </Property>
        <Property>
          <ID>35</ID>
          <Value>42918,6356944444</Value>
        </Property>
        <Property>
          <ID>215</ID>
          <Value>-35</Value>
        </Property>
        <Property>
          <ID>527</ID>
          <Value>--group=alph</Value>
        </Property>
        <Property>
          <ID>93</ID>
          <Value>42918,646145625</Value>
        </Property>
      </Properties>
    </Item>
    <Item>
      <ClassID>53</ClassID>
      <ItemID>4bf3d57e2eee9c572f7631e083d9de2a</ItemID>
      <ItemPath>https://ofx.xyz/multfilms/</ItemPath>
      <ParentID>6591a5c8-cebd-4e3d-813c-7d4d05b538e0</ParentID>
      <Properties>
        <Property>
          <ID>515</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>512</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>532</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>700</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>553</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>42</ID>
          <Value>3</Value>
        </Property>
        <Property>
          <ID>4</ID>
          <Value>05. Мультфильмы</Value>
        </Property>
        <Property>
          <ID>35</ID>
          <Value>42918,635</Value>
        </Property>
        <Property>
          <ID>215</ID>
          <Value>-35</Value>
        </Property>
        <Property>
          <ID>527</ID>
          <Value>--group=alph</Value>
        </Property>
        <Property>
          <ID>93</ID>
          <Value>42918,646145625</Value>
        </Property>
        <Property>
          <ID>525</ID>
          <Value>42980,7107894329</Value>
        </Property>
      </Properties>
    </Item>
    <Item>
      <ClassID>53</ClassID>
      <ItemID>7f65b18ec38df1a0dfa6d476ad62851a</ItemID>
      <ItemPath>https://ofx.xyz/cam/</ItemPath>
      <ParentID>6591a5c8-cebd-4e3d-813c-7d4d05b538e0</ParentID>
      <Properties>
        <Property>
          <ID>515</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>512</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>532</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>700</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>553</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>42</ID>
          <Value>3</Value>
        </Property>
        <Property>
          <ID>4</ID>
          <Value>06. Экранки</Value>
        </Property>
        <Property>
          <ID>35</ID>
          <Value>42918,6343055556</Value>
        </Property>
        <Property>
          <ID>215</ID>
          <Value>-35</Value>
        </Property>
        <Property>
          <ID>527</ID>
          <Value>--group=alph</Value>
        </Property>
        <Property>
          <ID>93</ID>
          <Value>42918,646145625</Value>
        </Property>
        <Property>
          <ID>525</ID>
          <Value>42980,7816471528</Value>
        </Property>
      </Properties>
    </Item>
    <Item>
      <ClassID>53</ClassID>
      <ItemID>4c0b69305095d757a8e0eef4815043f5</ItemID>
      <ItemPath>https://ofx.xyz/novinki/</ItemPath>
      <ParentID>6591a5c8-cebd-4e3d-813c-7d4d05b538e0</ParentID>
      <Properties>
        <Property>
          <ID>515</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>512</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>532</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>700</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>553</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>42</ID>
          <Value>3</Value>
        </Property>
        <Property>
          <ID>4</ID>
          <Value>07. Новинки в кино</Value>
        </Property>
        <Property>
          <ID>35</ID>
          <Value>42918,6336111111</Value>
        </Property>
        <Property>
          <ID>215</ID>
          <Value>-35</Value>
        </Property>
        <Property>
          <ID>527</ID>
          <Value>--group=alph</Value>
        </Property>
        <Property>
          <ID>93</ID>
          <Value>42918,646145625</Value>
        </Property>
        <Property>
          <ID>525</ID>
          <Value>42980,7204808218</Value>
        </Property>
      </Properties>
    </Item>
    <Item>
      <ClassID>53</ClassID>
      <ItemID>f49f869dfe6bea23a85dd09e61f36682</ItemID>
      <ItemPath>https://ofx.xyz/documental/</ItemPath>
      <ParentID>6591a5c8-cebd-4e3d-813c-7d4d05b538e0</ParentID>
      <Properties>
        <Property>
          <ID>515</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>512</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>532</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>700</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>553</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>42</ID>
          <Value>3</Value>
        </Property>
        <Property>
          <ID>4</ID>
          <Value>08. Документальный</Value>
        </Property>
        <Property>
          <ID>35</ID>
          <Value>42918,6329166667</Value>
        </Property>
        <Property>
          <ID>215</ID>
          <Value>-35</Value>
        </Property>
        <Property>
          <ID>527</ID>
          <Value>--group=alph</Value>
        </Property>
        <Property>
          <ID>93</ID>
          <Value>42918,646145625</Value>
        </Property>
      </Properties>
    </Item>
    <Item>
      <ClassID>53</ClassID>
      <ItemID>208fec81ff8d3628ded8b9106e16370c</ItemID>
      <ItemPath>https://ofx.xyz/erotik/</ItemPath>
      <ParentID>6591a5c8-cebd-4e3d-813c-7d4d05b538e0</ParentID>
      <Properties>
        <Property>
          <ID>515</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>512</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>532</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>700</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>553</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>42</ID>
          <Value>3</Value>
        </Property>
        <Property>
          <ID>4</ID>
          <Value>09. Эротика</Value>
        </Property>
        <Property>
          <ID>35</ID>
          <Value>42918,6322222222</Value>
        </Property>
        <Property>
          <ID>215</ID>
          <Value>-35</Value>
        </Property>
        <Property>
          <ID>527</ID>
          <Value>--group=alph</Value>
        </Property>
        <Property>
          <ID>93</ID>
          <Value>42918,646145625</Value>
        </Property>
      </Properties>
    </Item>
    <Item>
      <ClassID>53</ClassID>
      <ItemID>397437b5ab26bc55c05a7f9bb65b6425</ItemID>
      <ItemPath>https://ofx.xyz/istoric/</ItemPath>
      <ParentID>6591a5c8-cebd-4e3d-813c-7d4d05b538e0</ParentID>
      <Properties>
        <Property>
          <ID>515</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>512</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>532</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>700</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>553</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>42</ID>
          <Value>3</Value>
        </Property>
        <Property>
          <ID>4</ID>
          <Value>10. Исторический</Value>
        </Property>
        <Property>
          <ID>35</ID>
          <Value>42918,6315277778</Value>
        </Property>
        <Property>
          <ID>215</ID>
          <Value>-35</Value>
        </Property>
        <Property>
          <ID>527</ID>
          <Value>--group=alph</Value>
        </Property>
        <Property>
          <ID>93</ID>
          <Value>42918,646145625</Value>
        </Property>
      </Properties>
    </Item>
    <Item>
      <ClassID>53</ClassID>
      <ItemID>5b875b13-2e29-4ed7-b745-4af316ec622f</ItemID>
      <ItemPath>https://ofx.xyz/serials/</ItemPath>
      <ParentID>6591a5c8-cebd-4e3d-813c-7d4d05b538e0</ParentID>
      <Properties>
        <Property>
          <ID>515</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>512</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>532</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>700</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>553</ID>
          <Value>2</Value>
        </Property>
        <Property>
          <ID>42</ID>
          <Value>3</Value>
        </Property>
        <Property>
          <ID>4</ID>
          <Value>11. Сериалы</Value>
        </Property>
        <Property>
          <ID>701</ID>
          <Value>-1</Value>
        </Property>
        <Property>
          <ID>702</ID>
          <Value>-1</Value>
        </Property>
        <Property>
          <ID>517</ID>
          <Value>578-720,722-1080,482-576,402-480,322-400,202-320,0-200</Value>
        </Property>
        <Property>
          <ID>518</ID>
          <Value>0</Value>
        </Property>
        <Property>
          <ID>522</ID>
          <Value>0</Value>
        </Property>
        <Property>
          <ID>245</ID>
          <Value>5b875b13-2e29-4ed7-b745-4af316ec622f</Value>
        </Property>
        <Property>
          <ID>93</ID>
          <Value>42980,7293580787</Value>
        </Property>
        <Property>
          <ID>525</ID>
          <Value>43010,6201436343</Value>
        </Property>
      </Properties>
    </Item>
  </ChildItems>
</HmsMediaItem>
