<?xml version="1.0" encoding="utf-8"?>
<HmsMediaItem>
  <MediaType>3</MediaType>
  <ClassID>53</ClassID>
  <ItemID>0959a36b-22f4-424c-aff2-68c2163d394e</ItemID>
  <ItemPath>TTV Autoplaylist</ItemPath>
  <ParentID>234DF17B-418C-4FDC-9DFE-CD0C586D2E76</ParentID>
  <Properties>
    <Property>
      <ID>4</ID>
      <Value>TTV Autoplaylist - test</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>245</ID>
      <Value>0959a36b-22f4-424c-aff2-68c2163d394e</Value>
    </Property>
    <Property>
      <ID>93</ID>
      <Value>42037,9642572685</Value>
    </Property>
    <Property>
      <ID>530</ID>
      <Value>int gnTotal=0, gnImagesNotFound=0; String gsPlaylist=&apos;&apos;;

// ---- Преобразование имём с русскими символами в имя с английскими
string ru2Lat(string sName)
{
  sName = LowerCase(sName);
  Variant rus = [&apos;ж&apos; ,&apos;ч&apos; ,&apos;ш&apos; ,&apos;щ&apos; ,&apos;я&apos; ,&apos;ь&apos;,&apos;ъ&apos;,&apos; &apos;,&apos;_&apos;,"&apos;",&apos;-&apos;];
  Variant lat = [&apos;zh&apos;,&apos;ch&apos;,&apos;sh&apos;,&apos;sh&apos;,&apos;ya&apos;,&apos;&apos; ,&apos;&apos; ,&apos;&apos; ,&apos;&apos; ,&apos;&apos; ,&apos;&apos; ];
  for (int i=0; i&lt;Length(rus); i++) sName = ReplaceStr(sName, rus[i], lat[i]);
  string r = "абвгдеёзийклмнопрстуфхыэцю";
  string l = "abvgdeezijklmnoprstufhyecu";
  for (i=1; i&lt;=Length(r); i++) sName = ReplaceStr(sName, r[i], l[i]);
  return Trim(sName);
}

// ---- Создание файла m3u8 плейлиста (рекурсивно, начиная с укзанной папки)
void CreateM3U8_playlist(THmsScriptMediaItem Folder, String sFile, bool bContinue = False) {
  String sGrp, sName, sLink, sImg, sServer, sVal; int i; THmsScriptMediaItem Item;
  
  HmsRegExMatch(&apos;--server="(.*?)"&apos;, mpPodcastParameters, sServer);

  // Цикл обхода всех элементов в папке Folder
  for (i=0; i&lt;Folder.ChildCount; i++) {
    Item = Folder.ChildItems[i];
    
    // Если элемент - папка, то запускаем формирование плейлиста для этой папки
    if (Item.IsFolder) {
      CreateM3U8_playlist(Item, "", True); // Да, это она - "Рекурсия"
      continue;
    }
    
    if (bContinue) sGrp = Folder.Properties[mpiTitle];
    else           sGrp = "";
    
    sName = Item.Properties[mpiTitle    ];
    sImg  = Item.Properties[mpiThumbnail];
    
    gsPlaylist += Format(&apos;#EXTINF:-1 group-title="%s" tvg-logo="%s" tvg-name="%.3d",%s\r\n&apos;, [sGrp, sImg, i+1, sName]);
    gsPlaylist += &apos;http://&apos;+sServer+&apos;/MediaServer/VideoItems/&apos;+Item.ItemID+&apos;.mpg\r\n&apos;;
  }
  if (!bContinue) {
    // Попытка записать сформированые данные в файл
    try    { HmsStringToFile(&apos;#EXTM3U\r\n&apos;+HmsUtf8Encode(gsPlaylist), sFile); }
    except { HmsLogMessage(1, "Не удалось записать файл "+sFile); }
  }
}

// ----------------------------------------------------------------------------
void LoadPlaylist() {
  string sData, sLink, sName, sGrp, sFile, sImg, sVal, sReplaceWhat=&apos;&apos;, sReplaceWith=&apos;&apos;;
  THmsScriptMediaItem Item;
  
  sFile = mpFilePath; if (Trim(mpComment)!=&apos;&apos;) sFile = mpComment;  
  HmsRegExMatch(&apos;--playlist="(.*?)"&apos;   , mpPodcastParameters, sFile);
  HmsRegExMatch(&apos;--replaceWhat="(.*?)"&apos;, mpPodcastParameters, sReplaceWhat);
  HmsRegExMatch(&apos;--replaceWith="(.*?)"&apos;, mpPodcastParameters, sReplaceWith);
  
  if (HmsRegExMatch(&apos;^http&apos;, sFile, &apos;&apos;))
    sData = HmsDownloadUrl(sFile, &apos;&apos;, true);
  else
    sData = HmsStringFromFile(sFile);
  
  sData = HmsUtf8Decode(sData);

  if (sReplaceWhat!=&apos;&apos;) sData = ReplaceStr(sData, sReplaceWhat, sReplaceWith);
  
  TRegExpr RE = TRegExpr.Create(&apos;#EXTINF:-?\\d?,?(.*?)[\\r\\n]([^\\r\\n]+)[\\r\\n$]&apos;, PCRE_SINGLELINE);
  try {
    if (RE.Search(sData)) do {
      sName = RE.Match(1);
      sLink = RE.Match(2);
      
      sGrp = &apos;&apos;;
      if (HmsRegExMatch(&apos;.*\\((.*?)\\)&apos;, sName, sGrp)) sName = ReplaceStr(sName, &apos;(&apos;+sGrp+&apos;)&apos;, &apos;&apos;);
      
      CreateLink(sLink, sName, sGrp);
      
      if (HmsRegExMatch(&apos;\\b(HD)\\b&apos;, sName, sGrp)) {
        CreateLink(sLink, sName, sGrp);
      }

    } while (RE.SearchAgain());

  } finally { RE.Free(); }  
  HmsLogMessage(1, &apos;Всего каналов: &apos;+IntToStr(gnTotal));
  
}
        ///////////////////////////////////////////////////////////////////////////////
// ---- Создание ссылки на канал с проверкой, не создана ли уже с таким именем
void CreateLink(string sLink, string sName, string sGrp) {
  THmsScriptMediaItem Item, Folder = FolderItem; // Folder - текущая папка
  
  sName = Trim(sName);

  // Если указана группа - находим сначала её и делаем текущей папкой
  if (sGrp!=&apos;&apos;) Folder = Folder.FindItemByProperty(mpiTitle, sGrp);
  
   // Пытаемся найти элемент по наименованию в папке 
  if (sGrp!=&apos;&apos;) 
    Item = FolderItem.FindItemByProperty(mpiTitle, sGrp).FindItemByProperty(mpiTitle, sName);
  else
    Item = FolderItem.FindItemByProperty(mpiTitle, sName);
  
  // Если не найден - создаём
  if (Item == nil) Item = HmsCreateMediaItem(sLink, FolderItem.ItemID, sGrp);
  // Обновляем всю информацию
  Item[mpiFilePath      ] = sLink;
  Item[mpiTitle         ] = sName;
  Item[mpiThumbnail     ] = &apos;http://wonky.lostcut.net/tvim/&apos;+ru2Lat(sName)+&apos;.png&apos;;
  Item[mpiTimeLength    ] = &apos;11:40:00.000&apos;; // длинная длительность 
  Item[mpiInternetItem  ] = &apos;1&apos;;
  Item[mpiDVDAspectRatio] = &apos;16:9&apos;;
  Item[4001             ] = &apos;&apos;; // Снимаем пометку удаления
  gnTotal++;
}
  ///////////////////////////////////////////////////////////////////////////////
// ---- Рекурсивное удаление старых помеченных на удаление ссылок -------------
void DeleteOldLinks(THmsScriptMediaItem CurrentFolder) {
  int q; THmsScriptMediaItem Item;

  // Проверяем пометку для удаления у всех вложенных элементов (начиная с последней)
  for(q=CurrentFolder.ChildCount-1; q&gt;=0; q--) {
    Item = CurrentFolder.ChildItems[q];
    if (Item.IsFolder) 
      DeleteOldLinks(Item); // Если это папка - удаляем ссылки в ней
    else if(Item[4001]==&apos;1&apos;) 
      Item.Delete();        // Иначе, если эта ссылка помечена на удаление - конец ей
  }
}

  LoadPlaylist();
  // Удаляем помеченные для удаления ссылки начиная с текущей папки
  DeleteOldLinks(FolderItem); 
 
  // Если в параметрах узазан файл m3u8 - то запускаем функцию его создания
  if (HmsRegExMatch(&apos;--m3u8="([^"]+)"&apos;, mpPodcastParameters, mpFilePath)) CreateM3U8_playlist(FolderItem, mpFilePath);

}</Value>
    </Property>
    <Property>
      <ID>531</ID>
      <Value>C++Script</Value>
    </Property>
    <Property>
      <ID>527</ID>
      <Value>--replaceWhat="192.168.2.1:82" --replaceWith="127.0.0.1:82"</Value>
    </Property>
    <Property>
      <ID>525</ID>
      <Value>42380,87881625</Value>
    </Property>
    <Property>
      <ID>550</ID>
      <Value>string csCommandLine = &apos;cmd://"%s" --no-crashdump --play-and-exit --language en -Idummy --demuxdump-file="&lt;OUTPUT FILE&gt;" vlc://pause:4 --access=p2p_access "%s" :demux=dump&apos;;

// --------------------------------------- Получение пути AceStream плеера ----
string GetTsPlayerPath() {
  return ExtractShortPathName(IncludeTrailingBackslash(RegistryRead(&apos;Software\\AceStream\\InstallDir&apos;)))+&apos;Player\\ace_player.exe&apos;;
}

// ----------------------------------------------------------------------------
void GetTTVLink() {
  string sData, sLink, sID = &apos;&apos;;
  
  if (HmsRegExMatch(&apos;acestream://(.*)&apos;, mpFilePath, sID)) {
    HmsLogMessage(1, mpTitle+&apos;: Открываем по ID в ссылке&apos;);

  } else if (HmsRegExMatch(&apos;/pid/.*?/stream.mp4&apos;, mpFilePath, &apos;&apos;)) {
    MediaResourceLink = mpFilePath;

  } else if (HmsRegExMatch(&apos;^(.*acelive)$&apos;, mpFilePath, sID)) {
    HmsLogMessage(1, mpTitle+&apos;: Открываем по файлу .acelive&apos;);

  } else {
    sData = HmsUtf8Decode(HmsDownloadURL(mpFilePath, &apos;&apos;, true)); 

    if (HmsRegExMatch(&apos;loadTorrent\\("(.*?)"&apos;, sData, sLink)) {
      sID = HmsTempDirectory() + &apos;\\&apos; + mpTitle + &apos;.acelive&apos;;
      HmsDownloadURLToFile(sLink, sID);
      HmsLogMessage(1, mpTitle+&apos;: Открываем по торрент файлу&apos;);

    } else if (HmsRegExMatch(&apos;this.loadPlayer\\("(.*?)"&apos;, sData, sID)) {
      HmsLogMessage(1, mpTitle+&apos;: Открываем по ID в загруженной странице&apos;);

    } else {
      //HmsLogMessage(2, mpTitle+&apos;: Ошибка! Не найден ID или ссылка на torrent файл.&apos;);
      //return;

    }

  }

  if (sID!=&apos;&apos;) MediaResourceLink = Format(csCommandLine, [GetTsPlayerPath(), sID]);
  else         MediaResourceLink = mpFilePath; 
  
}

// ----------------------------------------------------------------------------
{
  GetTTVLink();
}</Value>
    </Property>
    <Property>
      <ID>551</ID>
      <Value>C++Script</Value>
    </Property>
    <Property>
      <ID>41</ID>
      <Value>http://super-pomoyka.us.to/trash/ttv-list/ttv.all.player.m3u</Value>
    </Property>
    <Property>
      <ID>43</ID>
      <Value>video/mpeg</Value>
    </Property>
    <Property>
      <ID>55</ID>
      <Value>https://i.ytimg.com/vi/WYURfBRkQ8o/maxresdefault.jpg</Value>
    </Property>
    <Property>
      <ID>42</ID>
      <Value>2</Value>
    </Property>
  </Properties>
</HmsMediaItem>
