<?xml version="1.0" encoding="utf-8"?>
<HmsMediaItem>
  <MediaType>1</MediaType>
  <ClassID>54</ClassID>
  <ItemID>8bb9d349-a9b4-4cd1-8941-0156ca5acbe5</ItemID>
  <ItemPath>AudioAddict Premium Radio</ItemPath>
  <ParentID>D07257A1-2B10-4D2B-9A4C-9C65C6F5B394</ParentID>
  <Properties>
    <Property>
      <ID>4</ID>
      <Value>AudioAddict Premium Radio</Value>
    </Property>
    <Property>
      <ID>515</ID>
      <Value>0</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>0</Value>
    </Property>
    <Property>
      <ID>522</ID>
      <Value>0</Value>
    </Property>
    <Property>
      <ID>570</ID>
      <Value>0</Value>
    </Property>
    <Property>
      <ID>245</ID>
      <Value>8bb9d349-a9b4-4cd1-8941-0156ca5acbe5</Value>
    </Property>
    <Property>
      <ID>93</ID>
      <Value>43050,4585934028</Value>
    </Property>
    <Property>
      <ID>530</ID>
      <Value>int gnTotal=0;
// ----------------------------------------------------------------------------
void LoadPlaylist() {
  string sData, sLink, sName, sImg, sVal, spName, TSINDEXVALUE; THmsScriptMediaItem Item, tRootFolder; int i, iTmp;
  
  // Если ссылка плейлиста начинается на http, то скачиваем, если нет - загружаем как локальный файл
  if (LeftCopy(mpFilePath, 4)==&apos;http&apos;) sData = HmsDownloadUrl(mpFilePath, &apos;&apos;, true);  // Загрузка плейлиста из интернета
    else                                 sData = HmsStringFromFile(mpFilePath);         // Загрузка плейлиста с локального диска
    
  sData = HmsUtf8Decode(sData);   // Декодируем из UTF-8 кодировки
  
  tRootFolder = FolderItem;
  TStringList TSLINKS = TStringList.Create();
  TStringList TSINDEX = TStringList.Create();
  
  // Разрешаем создание дубликатов. Не работает, видимо неправильно делаю.
  TSLINKS.Duplicates=dupAccept;
  
  // Создаём объект для поиска по регулярному выражению (в C++Script символ \ экранирует, поэтому двойной)
  TRegExpr RE = TRegExpr.Create(&apos;#EXTINF:-1,(.*?)[\\r\\n]+(.*?)([\\r\\n]|$)&apos;);
  try {
    if (RE.Search(sData)) do {    // Запускаем поиск и создаём цикл, пока найдены совпадения
      sName = Trim(RE.Match(1));  // Получаем значение первой группировки регулярного выражения (первая строка после #EXTINF:)
      sLink = Trim(RE.Match(2));  // Получаем значение второй группировки регулярного выражения (вся вторая строка)
      sName = Trim(ReplaceStr(sName,&apos;=&apos;,&apos;&apos;)); // Убираем лишние знаки равенства (ну глючит с ними)
      sName = Lowercase(sName); // Все в строчные, иначе с папками накладки могут быть
      
      if (Pos(&apos;pcradio&apos;,sLink)) break; // Если ссылка на PC Radio - пропускаем ее
        
      // Костыль для ссылок с одинаковым названием
      if(TSLINKS.IndexOfName(sName) != -1) sName = sName + &apos; &apos; + Str(gnTotal);
      
      // Заполняем список название станции=сслыка на поток
      TSLINKS.Values[sName] = sLink;
      // Берем часть имени до первого пробела для формирования папок
      spName = ExtractStr(sName, &apos; &apos;, 0);
      // Заполняем индексный список имя папки=&lt;n&gt; или имя папки=&lt;n1&gt;+&lt;n2&gt;+&lt;nn&gt; 
      if (TSINDEX.IndexOfName(spName) == -1) TSINDEX.Values[spName] = &apos;&lt;&apos; + Str(gnTotal) + &apos;&gt;&apos;;
      else TSINDEX.Values[spName] = TSINDEX.Values[spName] + &apos;+&lt;&apos; + Str(gnTotal) + &apos;&gt;&apos;;
      gnTotal++;                  // Увеличиваем счетчик созданных ссылок
      
    } while (RE.SearchAgain());   // Повторяем цикл, пока найдены следующие совпадения
    
  } finally { RE.Free(); }        // Освобождаем объект из памяти, что бы ни случилось  
  
  // Перебираем индексный список и формируем ссылки (с папками или без)
  for (i = 0; i &lt;  TSINDEX.Count; i++) {
    TSINDEXVALUE = TSINDEX.Values[TSINDEX.Names[i]];
    if (Pos(&apos;+&apos;,TSINDEXVALUE) &gt; 0) {
      TRegExpr RE1 = TRegExpr.Create(&apos;&lt;([\\d]+)&gt;&apos;);
      try {
        if (RE1.Search(TSINDEXVALUE)) do {
          iTmp = StrToInt(Trim(RE1.Match(1)));
          Item = FolderItem.AddFolder(ExtractStr(TSLINKS.Names[iTmp],&apos; &apos;,0));
          CreateItems(Item, TSLINKS.Names[iTmp],TSLINKS.Values[TSLINKS.Names[iTmp]]);
        } while (RE1.SearchAgain());
      } finally { RE1.Free(); }
    } else {
      HmsRegExMatch(&apos;&lt;([\\d]+)&gt;&apos;,TSINDEXVALUE,spName);
      iTmp = StrToInt(Trim(spName));
      CreateItems(tRootFolder, TSLINKS.Names[iTmp],TSLINKS.Values[TSLINKS.Names[iTmp]]);
    }
  }
  TSLINKS.Free();
  TSINDEX.Free();
  
  HmsLogMessage(1, mpTitle+&apos;: создано ссылок &apos;+IntToStr(gnTotal));
}

void CreateItems(THmsScriptMediaItem aFolder, String aName, String aLink) {
  String sImg, sTmp;
  THmsScriptMediaItem Item;
  
  //Заглушка для иконки
  sImg = &apos;https://media.licdn.com/media/AAEAAQAAAAAAAAWTAAAAJDQ4YzY2MGU4LWE1NWItNGI5My04MmQ1LTkxYWMyZDk2NDc5Zg.png&apos;;
  
  // Создаём ссылку
  Item = HmsCreateMediaItem(aLink, aFolder.ItemID);
  Item[mpiTitle    ] = aName; // Наименование
  Item[mpiThumbnail] = sImg;  // Картинка
  Item[mpiAlbum] = aName;
  Item[mpiAuthor     ] = &apos;RadioSlyNet&apos;;
  Item[mpiAlbumArtist] = &apos;RadioSlyNet&apos;;
  
  //Дублируем настройки подкаста в ссылки
  
  if (mpDirectLink) {
    Item[mpiInternetItem] = &apos;1&apos;;
    Item[mpiDirectLink]   = &apos;1&apos;;          // Параметр "Передавать данную ссылку, как ссылку на медиаресурс
    Item[mpiMimeType]     = mpMimeType; // Тип MIME для ссылки
  }
}

///////////////////////////////////////////////////////////////////////////////
//                      Г Л А В Н А Я   П Р О Ц Е Д У Р А                    //
// ----------------------------------------------------------------------------
{
  FolderItem.DeleteChildItems(); // Удаляем созданные ранее ссылки
  LoadPlaylist();                // Вызов процедуры загрузки плейлиста и создания из него ссылок
}</Value>
    </Property>
    <Property>
      <ID>531</ID>
      <Value>C++Script</Value>
    </Property>
    <Property>
      <ID>55</ID>
      <Value>https://media.licdn.com/media/AAEAAQAAAAAAAAWTAAAAJDQ4YzY2MGU4LWE1NWItNGI5My04MmQ1LTkxYWMyZDk2NDc5Zg.png</Value>
    </Property>
  </Properties>
  <ChildItems>
    <Item>
      <ClassID>53</ClassID>
      <ItemID>2c146b71-b4a9-4f8e-8aa5-b63ab5180d16</ItemID>
      <ItemPath>https://api.friezy.ru/playlists/m3u/CR.m3u</ItemPath>
      <ParentID>8bb9d349-a9b4-4cd1-8941-0156ca5acbe5</ParentID>
      <Properties>
        <Property>
          <ID>515</ID>
          <Value>1</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>0</Value>
        </Property>
        <Property>
          <ID>42</ID>
          <Value>3</Value>
        </Property>
        <Property>
          <ID>4</ID>
          <Value>Classical Radio</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>551</ID>
          <Value>Нет скрипта</Value>
        </Property>
        <Property>
          <ID>522</ID>
          <Value>0</Value>
        </Property>
        <Property>
          <ID>245</ID>
          <Value>2c146b71-b4a9-4f8e-8aa5-b63ab5180d16</Value>
        </Property>
        <Property>
          <ID>93</ID>
          <Value>43050,4589477546</Value>
        </Property>
        <Property>
          <ID>525</ID>
          <Value>43050,4699203588</Value>
        </Property>
        <Property>
          <ID>530</ID>
          <Value>int gnTotal=0;
// ----------------------------------------------------------------------------
void LoadPlaylist() {
  string sData, sLink, sName, sImg, sVal, spName, TSINDEXVALUE; THmsScriptMediaItem Item, tRootFolder; int i, iTmp;
  
  // Если ссылка плейлиста начинается на http, то скачиваем, если нет - загружаем как локальный файл
  if (LeftCopy(mpFilePath, 4)==&apos;http&apos;) sData = HmsDownloadUrl(mpFilePath, &apos;&apos;, true);  // Загрузка плейлиста из интернета
    else                                 sData = HmsStringFromFile(mpFilePath);         // Загрузка плейлиста с локального диска
    
  sData = HmsUtf8Decode(sData);   // Декодируем из UTF-8 кодировки
  
  tRootFolder = FolderItem;
  TStringList TSLINKS = TStringList.Create();
  TStringList TSINDEX = TStringList.Create();
  
  // Разрешаем создание дубликатов. Не работает, видимо неправильно делаю.
  TSLINKS.Duplicates=dupAccept;
  
  // Создаём объект для поиска по регулярному выражению (в C++Script символ \ экранирует, поэтому двойной)
  TRegExpr RE = TRegExpr.Create(&apos;#EXTINF:-1,(.*?)[\\r\\n]+(.*?)([\\r\\n]|$)&apos;);
  try {
    if (RE.Search(sData)) do {    // Запускаем поиск и создаём цикл, пока найдены совпадения
      sName = Trim(RE.Match(1));  // Получаем значение первой группировки регулярного выражения (первая строка после #EXTINF:)
      sLink = Trim(RE.Match(2));  // Получаем значение второй группировки регулярного выражения (вся вторая строка)
      sName = Trim(ReplaceStr(sName,&apos;=&apos;,&apos;&apos;)); // Убираем лишние знаки равенства (ну глючит с ними)
      sName = Lowercase(sName); // Все в строчные, иначе с папками накладки могут быть
      
      if (Pos(&apos;pcradio&apos;,sLink)) break; // Если ссылка на PC Radio - пропускаем ее
        
      // Костыль для ссылок с одинаковым названием
      if(TSLINKS.IndexOfName(sName) != -1) sName = sName + &apos; &apos; + Str(gnTotal);
      
      // Заполняем список название станции=сслыка на поток
      TSLINKS.Values[sName] = sLink;
      // Берем часть имени до первого пробела для формирования папок
      spName = ExtractStr(sName, &apos; &apos;, 0);
      // Заполняем индексный список имя папки=&lt;n&gt; или имя папки=&lt;n1&gt;+&lt;n2&gt;+&lt;nn&gt; 
      if (TSINDEX.IndexOfName(spName) == -1) TSINDEX.Values[spName] = &apos;&lt;&apos; + Str(gnTotal) + &apos;&gt;&apos;;
      else TSINDEX.Values[spName] = TSINDEX.Values[spName] + &apos;+&lt;&apos; + Str(gnTotal) + &apos;&gt;&apos;;
      gnTotal++;                  // Увеличиваем счетчик созданных ссылок
      
    } while (RE.SearchAgain());   // Повторяем цикл, пока найдены следующие совпадения
    
  } finally { RE.Free(); }        // Освобождаем объект из памяти, что бы ни случилось  
  
  // Перебираем индексный список и формируем ссылки (с папками или без)
  for (i = 0; i &lt;  TSINDEX.Count; i++) {
    TSINDEXVALUE = TSINDEX.Values[TSINDEX.Names[i]];
    if (Pos(&apos;+&apos;,TSINDEXVALUE) &gt; 0) {
      TRegExpr RE1 = TRegExpr.Create(&apos;&lt;([\\d]+)&gt;&apos;);
      try {
        if (RE1.Search(TSINDEXVALUE)) do {
          iTmp = StrToInt(Trim(RE1.Match(1)));
          Item = FolderItem.AddFolder(ExtractStr(TSLINKS.Names[iTmp],&apos; &apos;,0));
          CreateItems(Item, TSLINKS.Names[iTmp],TSLINKS.Values[TSLINKS.Names[iTmp]]);
        } while (RE1.SearchAgain());
      } finally { RE1.Free(); }
    } else {
      HmsRegExMatch(&apos;&lt;([\\d]+)&gt;&apos;,TSINDEXVALUE,spName);
      iTmp = StrToInt(Trim(spName));
      CreateItems(tRootFolder, TSLINKS.Names[iTmp],TSLINKS.Values[TSLINKS.Names[iTmp]]);
    }
  }
  TSLINKS.Free();
  TSINDEX.Free();
  
  HmsLogMessage(1, mpTitle+&apos;: создано ссылок &apos;+IntToStr(gnTotal));
}

void CreateItems(THmsScriptMediaItem aFolder, String aName, String aLink) {
  String sImg, sTmp;
  THmsScriptMediaItem Item;
  
  //Заглушка для иконки
  sImg = &apos;https://media.licdn.com/media/AAEAAQAAAAAAAAWTAAAAJDQ4YzY2MGU4LWE1NWItNGI5My04MmQ1LTkxYWMyZDk2NDc5Zg.png&apos;;
  
  // Создаём ссылку
  Item = HmsCreateMediaItem(aLink, aFolder.ItemID);
  Item[mpiTitle    ] = aName; // Наименование
  Item[mpiThumbnail] = sImg;  // Картинка
  Item[mpiAlbum] = aName;
  Item[mpiAuthor     ] = &apos;RadioSlyNet&apos;;
  Item[mpiAlbumArtist] = &apos;RadioSlyNet&apos;;
  
  //Дублируем настройки подкаста в ссылки
  
  if (mpDirectLink) {
    Item[mpiInternetItem] = &apos;1&apos;;
    Item[mpiDirectLink]   = &apos;1&apos;;          // Параметр "Передавать данную ссылку, как ссылку на медиаресурс
    Item[mpiMimeType]     = mpMimeType; // Тип MIME для ссылки
  }
}

///////////////////////////////////////////////////////////////////////////////
//                      Г Л А В Н А Я   П Р О Ц Е Д У Р А                    //
// ----------------------------------------------------------------------------
{
  FolderItem.DeleteChildItems(); // Удаляем созданные ранее ссылки
  LoadPlaylist();                // Вызов процедуры загрузки плейлиста и создания из него ссылок
}</Value>
        </Property>
        <Property>
          <ID>531</ID>
          <Value>C++Script</Value>
        </Property>
      </Properties>
    </Item>
    <Item>
      <ClassID>53</ClassID>
      <ItemID>28208876-5e33-47b4-ad5e-d20de3d88001</ItemID>
      <ItemPath>https://api.friezy.ru/playlists/m3u/DI.m3u</ItemPath>
      <ParentID>8bb9d349-a9b4-4cd1-8941-0156ca5acbe5</ParentID>
      <Properties>
        <Property>
          <ID>515</ID>
          <Value>1</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>4</ID>
          <Value>DI.FM</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>530</ID>
          <Value>int gnTotal=0;
// ----------------------------------------------------------------------------
void LoadPlaylist() {
  string sData, sLink, sName, sImg, sVal, spName, TSINDEXVALUE; THmsScriptMediaItem Item, tRootFolder; int i, iTmp;
  
  // Если ссылка плейлиста начинается на http, то скачиваем, если нет - загружаем как локальный файл
  if (LeftCopy(mpFilePath, 4)==&apos;http&apos;) sData = HmsDownloadUrl(mpFilePath, &apos;&apos;, true);  // Загрузка плейлиста из интернета
    else                                 sData = HmsStringFromFile(mpFilePath);         // Загрузка плейлиста с локального диска
    
  sData = HmsUtf8Decode(sData);   // Декодируем из UTF-8 кодировки
  
  tRootFolder = FolderItem;
  TStringList TSLINKS = TStringList.Create();
  TStringList TSINDEX = TStringList.Create();
  
  // Разрешаем создание дубликатов. Не работает, видимо неправильно делаю.
  TSLINKS.Duplicates=dupAccept;
  
  // Создаём объект для поиска по регулярному выражению (в C++Script символ \ экранирует, поэтому двойной)
  TRegExpr RE = TRegExpr.Create(&apos;#EXTINF:-1,(.*?)[\\r\\n]+(.*?)([\\r\\n]|$)&apos;);
  try {
    if (RE.Search(sData)) do {    // Запускаем поиск и создаём цикл, пока найдены совпадения
      sName = Trim(RE.Match(1));  // Получаем значение первой группировки регулярного выражения (первая строка после #EXTINF:)
      sLink = Trim(RE.Match(2));  // Получаем значение второй группировки регулярного выражения (вся вторая строка)
      sName = Trim(ReplaceStr(sName,&apos;=&apos;,&apos;&apos;)); // Убираем лишние знаки равенства (ну глючит с ними)
      sName = Lowercase(sName); // Все в строчные, иначе с папками накладки могут быть
      
      if (Pos(&apos;pcradio&apos;,sLink)) break; // Если ссылка на PC Radio - пропускаем ее
        
      // Костыль для ссылок с одинаковым названием
      if(TSLINKS.IndexOfName(sName) != -1) sName = sName + &apos; &apos; + Str(gnTotal);
      
      // Заполняем список название станции=сслыка на поток
      TSLINKS.Values[sName] = sLink;
      // Берем часть имени до первого пробела для формирования папок
      spName = ExtractStr(sName, &apos; &apos;, 0);
      // Заполняем индексный список имя папки=&lt;n&gt; или имя папки=&lt;n1&gt;+&lt;n2&gt;+&lt;nn&gt; 
      if (TSINDEX.IndexOfName(spName) == -1) TSINDEX.Values[spName] = &apos;&lt;&apos; + Str(gnTotal) + &apos;&gt;&apos;;
      else TSINDEX.Values[spName] = TSINDEX.Values[spName] + &apos;+&lt;&apos; + Str(gnTotal) + &apos;&gt;&apos;;
      gnTotal++;                  // Увеличиваем счетчик созданных ссылок
      
    } while (RE.SearchAgain());   // Повторяем цикл, пока найдены следующие совпадения
    
  } finally { RE.Free(); }        // Освобождаем объект из памяти, что бы ни случилось  
  
  // Перебираем индексный список и формируем ссылки (с папками или без)
  for (i = 0; i &lt;  TSINDEX.Count; i++) {
    TSINDEXVALUE = TSINDEX.Values[TSINDEX.Names[i]];
    if (Pos(&apos;+&apos;,TSINDEXVALUE) &gt; 0) {
      TRegExpr RE1 = TRegExpr.Create(&apos;&lt;([\\d]+)&gt;&apos;);
      try {
        if (RE1.Search(TSINDEXVALUE)) do {
          iTmp = StrToInt(Trim(RE1.Match(1)));
          Item = FolderItem.AddFolder(ExtractStr(TSLINKS.Names[iTmp],&apos; &apos;,0));
          CreateItems(Item, TSLINKS.Names[iTmp],TSLINKS.Values[TSLINKS.Names[iTmp]]);
        } while (RE1.SearchAgain());
      } finally { RE1.Free(); }
    } else {
      HmsRegExMatch(&apos;&lt;([\\d]+)&gt;&apos;,TSINDEXVALUE,spName);
      iTmp = StrToInt(Trim(spName));
      CreateItems(tRootFolder, TSLINKS.Names[iTmp],TSLINKS.Values[TSLINKS.Names[iTmp]]);
    }
  }
  TSLINKS.Free();
  TSINDEX.Free();
  
  HmsLogMessage(1, mpTitle+&apos;: создано ссылок &apos;+IntToStr(gnTotal));
}

void CreateItems(THmsScriptMediaItem aFolder, String aName, String aLink) {
  String sImg, sTmp;
  THmsScriptMediaItem Item;
  
  //Заглушка для иконки
  sImg = &apos;https://media.licdn.com/media/AAEAAQAAAAAAAAWTAAAAJDQ4YzY2MGU4LWE1NWItNGI5My04MmQ1LTkxYWMyZDk2NDc5Zg.png&apos;;
  
  // Создаём ссылку
  Item = HmsCreateMediaItem(aLink, aFolder.ItemID);
  Item[mpiTitle    ] = aName; // Наименование
  Item[mpiThumbnail] = sImg;  // Картинка
  Item[mpiAlbum] = aName;
  Item[mpiAuthor     ] = &apos;RadioSlyNet&apos;;
  Item[mpiAlbumArtist] = &apos;RadioSlyNet&apos;;
  
  //Дублируем настройки подкаста в ссылки
  
  if (mpDirectLink) {
    Item[mpiInternetItem] = &apos;1&apos;;
    Item[mpiDirectLink]   = &apos;1&apos;;          // Параметр "Передавать данную ссылку, как ссылку на медиаресурс
    Item[mpiMimeType]     = mpMimeType; // Тип MIME для ссылки
  }
}

///////////////////////////////////////////////////////////////////////////////
//                      Г Л А В Н А Я   П Р О Ц Е Д У Р А                    //
// ----------------------------------------------------------------------------
{
  FolderItem.DeleteChildItems(); // Удаляем созданные ранее ссылки
  LoadPlaylist();                // Вызов процедуры загрузки плейлиста и создания из него ссылок
}</Value>
        </Property>
        <Property>
          <ID>531</ID>
          <Value>C++Script</Value>
        </Property>
        <Property>
          <ID>522</ID>
          <Value>0</Value>
        </Property>
        <Property>
          <ID>245</ID>
          <Value>28208876-5e33-47b4-ad5e-d20de3d88001</Value>
        </Property>
        <Property>
          <ID>93</ID>
          <Value>43050,4603482176</Value>
        </Property>
        <Property>
          <ID>525</ID>
          <Value>43050,4707433912</Value>
        </Property>
      </Properties>
    </Item>
    <Item>
      <ClassID>53</ClassID>
      <ItemID>6f337742-0a2b-450e-a44e-bd0ca85ff0c8</ItemID>
      <ItemPath>https://api.friezy.ru/playlists/m3u/JR.m3u</ItemPath>
      <ParentID>8bb9d349-a9b4-4cd1-8941-0156ca5acbe5</ParentID>
      <Properties>
        <Property>
          <ID>515</ID>
          <Value>1</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>4</ID>
          <Value>Jazz Radio</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>6f337742-0a2b-450e-a44e-bd0ca85ff0c8</Value>
        </Property>
        <Property>
          <ID>93</ID>
          <Value>43050,4626469097</Value>
        </Property>
        <Property>
          <ID>530</ID>
          <Value>int gnTotal=0;
// ----------------------------------------------------------------------------
void LoadPlaylist() {
  string sData, sLink, sName, sImg, sVal, spName, TSINDEXVALUE; THmsScriptMediaItem Item, tRootFolder; int i, iTmp;
  
  // Если ссылка плейлиста начинается на http, то скачиваем, если нет - загружаем как локальный файл
  if (LeftCopy(mpFilePath, 4)==&apos;http&apos;) sData = HmsDownloadUrl(mpFilePath, &apos;&apos;, true);  // Загрузка плейлиста из интернета
    else                                 sData = HmsStringFromFile(mpFilePath);         // Загрузка плейлиста с локального диска
    
  sData = HmsUtf8Decode(sData);   // Декодируем из UTF-8 кодировки
  
  tRootFolder = FolderItem;
  TStringList TSLINKS = TStringList.Create();
  TStringList TSINDEX = TStringList.Create();
  
  // Разрешаем создание дубликатов. Не работает, видимо неправильно делаю.
  TSLINKS.Duplicates=dupAccept;
  
  // Создаём объект для поиска по регулярному выражению (в C++Script символ \ экранирует, поэтому двойной)
  TRegExpr RE = TRegExpr.Create(&apos;#EXTINF:-1,(.*?)[\\r\\n]+(.*?)([\\r\\n]|$)&apos;);
  try {
    if (RE.Search(sData)) do {    // Запускаем поиск и создаём цикл, пока найдены совпадения
      sName = Trim(RE.Match(1));  // Получаем значение первой группировки регулярного выражения (первая строка после #EXTINF:)
      sLink = Trim(RE.Match(2));  // Получаем значение второй группировки регулярного выражения (вся вторая строка)
      sName = Trim(ReplaceStr(sName,&apos;=&apos;,&apos;&apos;)); // Убираем лишние знаки равенства (ну глючит с ними)
      sName = Lowercase(sName); // Все в строчные, иначе с папками накладки могут быть
      
      if (Pos(&apos;pcradio&apos;,sLink)) break; // Если ссылка на PC Radio - пропускаем ее
        
      // Костыль для ссылок с одинаковым названием
      if(TSLINKS.IndexOfName(sName) != -1) sName = sName + &apos; &apos; + Str(gnTotal);
      
      // Заполняем список название станции=сслыка на поток
      TSLINKS.Values[sName] = sLink;
      // Берем часть имени до первого пробела для формирования папок
      spName = ExtractStr(sName, &apos; &apos;, 0);
      // Заполняем индексный список имя папки=&lt;n&gt; или имя папки=&lt;n1&gt;+&lt;n2&gt;+&lt;nn&gt; 
      if (TSINDEX.IndexOfName(spName) == -1) TSINDEX.Values[spName] = &apos;&lt;&apos; + Str(gnTotal) + &apos;&gt;&apos;;
      else TSINDEX.Values[spName] = TSINDEX.Values[spName] + &apos;+&lt;&apos; + Str(gnTotal) + &apos;&gt;&apos;;
      gnTotal++;                  // Увеличиваем счетчик созданных ссылок
      
    } while (RE.SearchAgain());   // Повторяем цикл, пока найдены следующие совпадения
    
  } finally { RE.Free(); }        // Освобождаем объект из памяти, что бы ни случилось  
  
  // Перебираем индексный список и формируем ссылки (с папками или без)
  for (i = 0; i &lt;  TSINDEX.Count; i++) {
    TSINDEXVALUE = TSINDEX.Values[TSINDEX.Names[i]];
    if (Pos(&apos;+&apos;,TSINDEXVALUE) &gt; 0) {
      TRegExpr RE1 = TRegExpr.Create(&apos;&lt;([\\d]+)&gt;&apos;);
      try {
        if (RE1.Search(TSINDEXVALUE)) do {
          iTmp = StrToInt(Trim(RE1.Match(1)));
          Item = FolderItem.AddFolder(ExtractStr(TSLINKS.Names[iTmp],&apos; &apos;,0));
          CreateItems(Item, TSLINKS.Names[iTmp],TSLINKS.Values[TSLINKS.Names[iTmp]]);
        } while (RE1.SearchAgain());
      } finally { RE1.Free(); }
    } else {
      HmsRegExMatch(&apos;&lt;([\\d]+)&gt;&apos;,TSINDEXVALUE,spName);
      iTmp = StrToInt(Trim(spName));
      CreateItems(tRootFolder, TSLINKS.Names[iTmp],TSLINKS.Values[TSLINKS.Names[iTmp]]);
    }
  }
  TSLINKS.Free();
  TSINDEX.Free();
  
  HmsLogMessage(1, mpTitle+&apos;: создано ссылок &apos;+IntToStr(gnTotal));
}

void CreateItems(THmsScriptMediaItem aFolder, String aName, String aLink) {
  String sImg, sTmp;
  THmsScriptMediaItem Item;
  
  //Заглушка для иконки
  sImg = &apos;https://media.licdn.com/media/AAEAAQAAAAAAAAWTAAAAJDQ4YzY2MGU4LWE1NWItNGI5My04MmQ1LTkxYWMyZDk2NDc5Zg.png&apos;;
  
  // Создаём ссылку
  Item = HmsCreateMediaItem(aLink, aFolder.ItemID);
  Item[mpiTitle    ] = aName; // Наименование
  Item[mpiThumbnail] = sImg;  // Картинка
  Item[mpiAlbum] = aName;
  Item[mpiAuthor     ] = &apos;RadioSlyNet&apos;;
  Item[mpiAlbumArtist] = &apos;RadioSlyNet&apos;;
  
  //Дублируем настройки подкаста в ссылки
  
  if (mpDirectLink) {
    Item[mpiInternetItem] = &apos;1&apos;;
    Item[mpiDirectLink]   = &apos;1&apos;;          // Параметр "Передавать данную ссылку, как ссылку на медиаресурс
    Item[mpiMimeType]     = mpMimeType; // Тип MIME для ссылки
  }
}

///////////////////////////////////////////////////////////////////////////////
//                      Г Л А В Н А Я   П Р О Ц Е Д У Р А                    //
// ----------------------------------------------------------------------------
{
  FolderItem.DeleteChildItems(); // Удаляем созданные ранее ссылки
  LoadPlaylist();                // Вызов процедуры загрузки плейлиста и создания из него ссылок
}</Value>
        </Property>
        <Property>
          <ID>531</ID>
          <Value>C++Script</Value>
        </Property>
        <Property>
          <ID>525</ID>
          <Value>43050,4708969676</Value>
        </Property>
      </Properties>
    </Item>
    <Item>
      <ClassID>53</ClassID>
      <ItemID>5e02ba8d-13c6-46dd-a899-4133f7ba6ec8</ItemID>
      <ItemPath>https://api.friezy.ru/playlists/m3u/RT.m3u</ItemPath>
      <ParentID>8bb9d349-a9b4-4cd1-8941-0156ca5acbe5</ParentID>
      <Properties>
        <Property>
          <ID>515</ID>
          <Value>1</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>4</ID>
          <Value>Radio Tunes</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>530</ID>
          <Value> int gnTotal=0;
// ----------------------------------------------------------------------------
void LoadPlaylist() {
  string sData, sLink, sName, sImg, sVal, spName, TSINDEXVALUE; THmsScriptMediaItem Item, tRootFolder; int i, iTmp;
  
  // Если ссылка плейлиста начинается на http, то скачиваем, если нет - загружаем как локальный файл
  if (LeftCopy(mpFilePath, 4)==&apos;http&apos;) sData = HmsDownloadUrl(mpFilePath, &apos;&apos;, true);  // Загрузка плейлиста из интернета
    else                                 sData = HmsStringFromFile(mpFilePath);         // Загрузка плейлиста с локального диска
    
  sData = HmsUtf8Decode(sData);   // Декодируем из UTF-8 кодировки
  
  tRootFolder = FolderItem;
  TStringList TSLINKS = TStringList.Create();
  TStringList TSINDEX = TStringList.Create();
  
  // Разрешаем создание дубликатов. Не работает, видимо неправильно делаю.
  TSLINKS.Duplicates=dupAccept;
  
  // Создаём объект для поиска по регулярному выражению (в C++Script символ \ экранирует, поэтому двойной)
  TRegExpr RE = TRegExpr.Create(&apos;#EXTINF:-1,(.*?)[\\r\\n]+(.*?)([\\r\\n]|$)&apos;);
  try {
    if (RE.Search(sData)) do {    // Запускаем поиск и создаём цикл, пока найдены совпадения
      sName = Trim(RE.Match(1));  // Получаем значение первой группировки регулярного выражения (первая строка после #EXTINF:)
      sLink = Trim(RE.Match(2));  // Получаем значение второй группировки регулярного выражения (вся вторая строка)
      sName = Trim(ReplaceStr(sName,&apos;=&apos;,&apos;&apos;)); // Убираем лишние знаки равенства (ну глючит с ними)
      sName = Lowercase(sName); // Все в строчные, иначе с папками накладки могут быть
      
      if (Pos(&apos;pcradio&apos;,sLink)) break; // Если ссылка на PC Radio - пропускаем ее
        
      // Костыль для ссылок с одинаковым названием
      if(TSLINKS.IndexOfName(sName) != -1) sName = sName + &apos; &apos; + Str(gnTotal);
      
      // Заполняем список название станции=сслыка на поток
      TSLINKS.Values[sName] = sLink;
      // Берем часть имени до первого пробела для формирования папок
      spName = ExtractStr(sName, &apos; &apos;, 0);
      // Заполняем индексный список имя папки=&lt;n&gt; или имя папки=&lt;n1&gt;+&lt;n2&gt;+&lt;nn&gt; 
      if (TSINDEX.IndexOfName(spName) == -1) TSINDEX.Values[spName] = &apos;&lt;&apos; + Str(gnTotal) + &apos;&gt;&apos;;
      else TSINDEX.Values[spName] = TSINDEX.Values[spName] + &apos;+&lt;&apos; + Str(gnTotal) + &apos;&gt;&apos;;
      gnTotal++;                  // Увеличиваем счетчик созданных ссылок
      
    } while (RE.SearchAgain());   // Повторяем цикл, пока найдены следующие совпадения
    
  } finally { RE.Free(); }        // Освобождаем объект из памяти, что бы ни случилось  
  
  // Перебираем индексный список и формируем ссылки (с папками или без)
  for (i = 0; i &lt;  TSINDEX.Count; i++) {
    TSINDEXVALUE = TSINDEX.Values[TSINDEX.Names[i]];
    if (Pos(&apos;+&apos;,TSINDEXVALUE) &gt; 0) {
      TRegExpr RE1 = TRegExpr.Create(&apos;&lt;([\\d]+)&gt;&apos;);
      try {
        if (RE1.Search(TSINDEXVALUE)) do {
          iTmp = StrToInt(Trim(RE1.Match(1)));
          Item = FolderItem.AddFolder(ExtractStr(TSLINKS.Names[iTmp],&apos; &apos;,0));
          CreateItems(Item, TSLINKS.Names[iTmp],TSLINKS.Values[TSLINKS.Names[iTmp]]);
        } while (RE1.SearchAgain());
      } finally { RE1.Free(); }
    } else {
      HmsRegExMatch(&apos;&lt;([\\d]+)&gt;&apos;,TSINDEXVALUE,spName);
      iTmp = StrToInt(Trim(spName));
      CreateItems(tRootFolder, TSLINKS.Names[iTmp],TSLINKS.Values[TSLINKS.Names[iTmp]]);
    }
  }
  TSLINKS.Free();
  TSINDEX.Free();
  
  HmsLogMessage(1, mpTitle+&apos;: создано ссылок &apos;+IntToStr(gnTotal));
}

void CreateItems(THmsScriptMediaItem aFolder, String aName, String aLink) {
  String sImg, sTmp;
  THmsScriptMediaItem Item;
  
  //Заглушка для иконки
  sImg = &apos;https://media.licdn.com/media/AAEAAQAAAAAAAAWTAAAAJDQ4YzY2MGU4LWE1NWItNGI5My04MmQ1LTkxYWMyZDk2NDc5Zg.png&apos;;
  
  // Создаём ссылку
  Item = HmsCreateMediaItem(aLink, aFolder.ItemID);
  Item[mpiTitle    ] = aName; // Наименование
  Item[mpiThumbnail] = sImg;  // Картинка
  Item[mpiAlbum] = aName;
  Item[mpiAuthor     ] = &apos;RadioSlyNet&apos;;
  Item[mpiAlbumArtist] = &apos;RadioSlyNet&apos;;
  
  //Дублируем настройки подкаста в ссылки
  
  if (mpDirectLink) {
    Item[mpiInternetItem] = &apos;1&apos;;
    Item[mpiDirectLink]   = &apos;1&apos;;          // Параметр "Передавать данную ссылку, как ссылку на медиаресурс
    Item[mpiMimeType]     = mpMimeType; // Тип MIME для ссылки
  }
}

///////////////////////////////////////////////////////////////////////////////
//                      Г Л А В Н А Я   П Р О Ц Е Д У Р А                    //
// ----------------------------------------------------------------------------
{
  FolderItem.DeleteChildItems(); // Удаляем созданные ранее ссылки
  LoadPlaylist();                // Вызов процедуры загрузки плейлиста и создания из него ссылок
}</Value>
        </Property>
        <Property>
          <ID>531</ID>
          <Value>C++Script</Value>
        </Property>
        <Property>
          <ID>522</ID>
          <Value>0</Value>
        </Property>
        <Property>
          <ID>245</ID>
          <Value>5e02ba8d-13c6-46dd-a899-4133f7ba6ec8</Value>
        </Property>
        <Property>
          <ID>93</ID>
          <Value>43050,4654665857</Value>
        </Property>
        <Property>
          <ID>525</ID>
          <Value>43050,4709656482</Value>
        </Property>
      </Properties>
    </Item>
    <Item>
      <ClassID>53</ClassID>
      <ItemID>fc3f495c-0bec-4e8f-85a4-8a6484a286c4</ItemID>
      <ItemPath>https://api.friezy.ru/playlists/m3u/RR.m3u</ItemPath>
      <ParentID>8bb9d349-a9b4-4cd1-8941-0156ca5acbe5</ParentID>
      <Properties>
        <Property>
          <ID>515</ID>
          <Value>1</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>4</ID>
          <Value>Rock Radio</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>530</ID>
          <Value> int gnTotal=0;
// ----------------------------------------------------------------------------
void LoadPlaylist() {
  string sData, sLink, sName, sImg, sVal, spName, TSINDEXVALUE; THmsScriptMediaItem Item, tRootFolder; int i, iTmp;
  
  // Если ссылка плейлиста начинается на http, то скачиваем, если нет - загружаем как локальный файл
  if (LeftCopy(mpFilePath, 4)==&apos;http&apos;) sData = HmsDownloadUrl(mpFilePath, &apos;&apos;, true);  // Загрузка плейлиста из интернета
    else                                 sData = HmsStringFromFile(mpFilePath);         // Загрузка плейлиста с локального диска
    
  sData = HmsUtf8Decode(sData);   // Декодируем из UTF-8 кодировки
  
  tRootFolder = FolderItem;
  TStringList TSLINKS = TStringList.Create();
  TStringList TSINDEX = TStringList.Create();
  
  // Разрешаем создание дубликатов. Не работает, видимо неправильно делаю.
  TSLINKS.Duplicates=dupAccept;
  
  // Создаём объект для поиска по регулярному выражению (в C++Script символ \ экранирует, поэтому двойной)
  TRegExpr RE = TRegExpr.Create(&apos;#EXTINF:-1,(.*?)[\\r\\n]+(.*?)([\\r\\n]|$)&apos;);
  try {
    if (RE.Search(sData)) do {    // Запускаем поиск и создаём цикл, пока найдены совпадения
      sName = Trim(RE.Match(1));  // Получаем значение первой группировки регулярного выражения (первая строка после #EXTINF:)
      sLink = Trim(RE.Match(2));  // Получаем значение второй группировки регулярного выражения (вся вторая строка)
      sName = Trim(ReplaceStr(sName,&apos;=&apos;,&apos;&apos;)); // Убираем лишние знаки равенства (ну глючит с ними)
      sName = Lowercase(sName); // Все в строчные, иначе с папками накладки могут быть
      
      if (Pos(&apos;pcradio&apos;,sLink)) break; // Если ссылка на PC Radio - пропускаем ее
        
      // Костыль для ссылок с одинаковым названием
      if(TSLINKS.IndexOfName(sName) != -1) sName = sName + &apos; &apos; + Str(gnTotal);
      
      // Заполняем список название станции=сслыка на поток
      TSLINKS.Values[sName] = sLink;
      // Берем часть имени до первого пробела для формирования папок
      spName = ExtractStr(sName, &apos; &apos;, 0);
      // Заполняем индексный список имя папки=&lt;n&gt; или имя папки=&lt;n1&gt;+&lt;n2&gt;+&lt;nn&gt; 
      if (TSINDEX.IndexOfName(spName) == -1) TSINDEX.Values[spName] = &apos;&lt;&apos; + Str(gnTotal) + &apos;&gt;&apos;;
      else TSINDEX.Values[spName] = TSINDEX.Values[spName] + &apos;+&lt;&apos; + Str(gnTotal) + &apos;&gt;&apos;;
      gnTotal++;                  // Увеличиваем счетчик созданных ссылок
      
    } while (RE.SearchAgain());   // Повторяем цикл, пока найдены следующие совпадения
    
  } finally { RE.Free(); }        // Освобождаем объект из памяти, что бы ни случилось  
  
  // Перебираем индексный список и формируем ссылки (с папками или без)
  for (i = 0; i &lt;  TSINDEX.Count; i++) {
    TSINDEXVALUE = TSINDEX.Values[TSINDEX.Names[i]];
    if (Pos(&apos;+&apos;,TSINDEXVALUE) &gt; 0) {
      TRegExpr RE1 = TRegExpr.Create(&apos;&lt;([\\d]+)&gt;&apos;);
      try {
        if (RE1.Search(TSINDEXVALUE)) do {
          iTmp = StrToInt(Trim(RE1.Match(1)));
          Item = FolderItem.AddFolder(ExtractStr(TSLINKS.Names[iTmp],&apos; &apos;,0));
          CreateItems(Item, TSLINKS.Names[iTmp],TSLINKS.Values[TSLINKS.Names[iTmp]]);
        } while (RE1.SearchAgain());
      } finally { RE1.Free(); }
    } else {
      HmsRegExMatch(&apos;&lt;([\\d]+)&gt;&apos;,TSINDEXVALUE,spName);
      iTmp = StrToInt(Trim(spName));
      CreateItems(tRootFolder, TSLINKS.Names[iTmp],TSLINKS.Values[TSLINKS.Names[iTmp]]);
    }
  }
  TSLINKS.Free();
  TSINDEX.Free();
  
  HmsLogMessage(1, mpTitle+&apos;: создано ссылок &apos;+IntToStr(gnTotal));
}

void CreateItems(THmsScriptMediaItem aFolder, String aName, String aLink) {
  String sImg, sTmp;
  THmsScriptMediaItem Item;
  
  //Заглушка для иконки
  sImg = &apos;https://media.licdn.com/media/AAEAAQAAAAAAAAWTAAAAJDQ4YzY2MGU4LWE1NWItNGI5My04MmQ1LTkxYWMyZDk2NDc5Zg.png&apos;;
  
  // Создаём ссылку
  Item = HmsCreateMediaItem(aLink, aFolder.ItemID);
  Item[mpiTitle    ] = aName; // Наименование
  Item[mpiThumbnail] = sImg;  // Картинка
  Item[mpiAlbum] = aName;
  Item[mpiAuthor     ] = &apos;RadioSlyNet&apos;;
  Item[mpiAlbumArtist] = &apos;RadioSlyNet&apos;;
  
  //Дублируем настройки подкаста в ссылки
  
  if (mpDirectLink) {
    Item[mpiInternetItem] = &apos;1&apos;;
    Item[mpiDirectLink]   = &apos;1&apos;;          // Параметр "Передавать данную ссылку, как ссылку на медиаресурс
    Item[mpiMimeType]     = mpMimeType; // Тип MIME для ссылки
  }
}

///////////////////////////////////////////////////////////////////////////////
//                      Г Л А В Н А Я   П Р О Ц Е Д У Р А                    //
// ----------------------------------------------------------------------------
{
  FolderItem.DeleteChildItems(); // Удаляем созданные ранее ссылки
  LoadPlaylist();                // Вызов процедуры загрузки плейлиста и создания из него ссылок
}</Value>
        </Property>
        <Property>
          <ID>531</ID>
          <Value>C++Script</Value>
        </Property>
        <Property>
          <ID>522</ID>
          <Value>0</Value>
        </Property>
        <Property>
          <ID>245</ID>
          <Value>fc3f495c-0bec-4e8f-85a4-8a6484a286c4</Value>
        </Property>
        <Property>
          <ID>93</ID>
          <Value>43050,4660671759</Value>
        </Property>
        <Property>
          <ID>525</ID>
          <Value>43050,4710076273</Value>
        </Property>
      </Properties>
    </Item>
  </ChildItems>
</HmsMediaItem>
