<?xml version="1.0" encoding="utf-8"?>
<HmsMediaItem>
  <MediaType>3</MediaType>
  <ClassID>51</ClassID>
  <ItemID>2c22405e-3f43-4ca9-8f1b-1806ef2374da</ItemID>
  <ItemPath>http://putlocker.co</ItemPath>
  <ParentID>234DF17B-418C-4FDC-9DFE-CD0C586D2E76</ParentID>
  <Properties>
    <Property>
      <ID>4</ID>
      <Value>Putlocker</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>2c22405e-3f43-4ca9-8f1b-1806ef2374da</Value>
    </Property>
    <Property>
      <ID>93</ID>
      <Value>42778,4301886574</Value>
    </Property>
    <Property>
      <ID>571</ID>
      <Value>char gsUrlBase="http://putlocker.co"; int gnTotalItems=0; TDateTime gTimeStart=Now;

///////////////////////////////////////////////////////////////////////////////
// Создание подкаста или папки
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;
}

///////////////////////////////////////////////////////////////////////////////
{
  THmsScriptMediaItem Folder, Item;
  
  FolderItem.DeleteChildItems();
  Folder = CreateItem(FolderItem, &apos;TV series&apos;,&apos;/tv&apos;);
  Folder[mpiPodcastParameters] = &apos;--group=alph&apos;;
  Folder[mpiFolderSortOrder  ] = mpiTitle;
  HmsLogMessage(1, mpTitle+&apos;: Создано ссылок - &apos;+IntToStr(gnTotalItems));
}</Value>
    </Property>
    <Property>
      <ID>572</ID>
      <Value>C++Script</Value>
    </Property>
    <Property>
      <ID>530</ID>
      <Value>///////////////////////////////////////////////////////////////////////////////
//           By  slim8020  in  collaboration  with  WendyH  2017             //

string    gsUrlBase    = &apos;http://putlocker.co&apos;; // База для относительных ссылок
int       gnTotalItems = 0;                      // Счётчик созданных элементов
TDateTime gStart       = Now;                    // Время начала запуска скрипта
string    gsTime       = "02:30:00.000";         // Продолжительность видео
int gnMaxPages=10, gnMaxInGroup=100; bool gbYearInTitle=false; char gsGroupMode=&apos;&apos;;

// Регулярные выражения для поиска на странице блоков с информацией о видео
string gsPatternBlock = &apos;(&lt;td\\swidth="2.*?&lt;\\/td&gt;)&apos;;      // Искомые блоки
string gsPatternTitle = &apos;title="([^(]+)\\(\\d*\\)"&gt;&lt;b&gt;&apos;;   // Название
string gsPatternLink  = &apos;;"&gt;&lt;a\\shref="(http:\\/\\/putlocker\\.co\\/watch-\\S+-tvshow-online-free-putlocker\\.html)&apos;;    // Ссылка
string gsPatternYear  = &apos;title="[^(]+\\((\\d{4})\\)"&gt;&lt;b&gt;&apos;; // Год
string gsPatternImage  = &apos;(http:\\/\\/image3\\.putlocker\\.co\\/images\\/covers\\/\\S+-tvshow-online-free-putlocker\\.jpg)&apos;; // Обложка
string gsPatternPages = &apos;&gt;(\\d{2,})&lt;\\/a&gt;&lt;\\/[^\\/]+\\/\\/putlocker\\.co\\/tv\\/\\d"&apos;; // Регулярное выражение для поиска максимального номера страницы для дозагрузки
string gsPagesParams  = &apos;tv/&lt;PN&gt;&apos;;                         // Параметр с номером страницы, который добавляется к ссылке
string gsHeaders = &apos;Referer: &apos;+gsUrlBase+&apos;/\r\n&apos;+          // HTTP заголовки для запросов
                   &apos;Accept-Encoding: gzip, deflate\r\n&apos;+
                   &apos;Origin: &apos;+gsUrlBase+&apos;\r\n&apos;+
                   &apos;User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36\r\n&apos;;

///////////////////////////////////////////////////////////////////////////////
//                              Ф У Н К Ц И И                                //

///////////////////////////////////////////////////////////////////////////////
// Создание ссылки на видео
THmsScriptMediaItem CreateMediaItem(THmsScriptMediaItem Folder, string sTitle, 
string sLink, string sImg, string sTime) {
  THmsScriptMediaItem Item = HmsCreateMediaItem(sLink, Folder.ItemID);
  Item[mpiTitle     ] = sTitle; // Присваиваем наименование
  Item[mpiThumbnail ] = sImg;   // Картинка
  Item[mpiCreateDate] = VarToStr(IncTime(gStart,0,-gnTotalItems,0,0));
  Item[mpiTimeLength] = sTime;  // Продолжительность
  gnTotalItems++;               // Увеличиваем счетчик созданных элементов
  return Item;                  // Возвращаем созданный объект
}

///////////////////////////////////////////////////////////////////////////////
// Создание папки или подкаста
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;// sKPID, sTran;
  THmsScriptMediaItem Item, Folder = FolderItem; TRegExpr RegEx;
  int i, n, nPages=0, iCnt=0, nGrp=0; char sGrp=""; bool bGroup, bJustLinks;
  
  // Проверка установленных дополнительных параметров
  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);
  bJustLinks    = (Pos(&apos;--justlinks&apos;  , mpPodcastParameters)&gt;0);
 
  sHtml = HmsDownloadURL(mpFilePath, gsHeaders, 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, между которыми
  // будем искать блоки текста с сылкой, наименованием и проч.
    
  // =========================================================================
  // Дозагрузка страниц
  //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 = ReplaceStr(mpFilePath, &apos;/tv&apos;, &apos;/&apos;+ReplaceStr(gsPagesParams, &apos;&lt;PN&gt;&apos;, IntToStr(i)));
    sPage = HmsDownloadURL(sLink, &apos;Referer: &apos;+gsUrlBase, true);
    sPage = HmsUtf8Decode(sPage);
    sHtml += sPage;
    if (HmsCancelPressed) break;
  }
  HmsHideProgress();
  // =========================================================================
  
  // Создаём объект для поиска блоков текста по регулярному выражению,
  // в которых есть информация: ссылка, наименование, ссылка на картинку и проч.
  RegEx = TRegExpr.Create(gsPatternBlock, PCRE_SINGLELINE || PCRE_MULTILINE);
  try {
    // Определяем, если блоков в загруженном более чем gnMaxInGroup, включаем группировку
    if ((gsGroupMode!=&apos;alph&apos;) &amp;&amp; (gsGroupMode!=&apos;year&apos;)) {
      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(gsPatternYear , RegEx.Match, sYear);
      HmsRegExMatch(gsPatternImage, RegEx.Match, sImg);

      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]));
      }
      
      Item = CreateFolder(Folder, sName, sLink, sImg); // Создание папки с фильмом
      Item[mpiSeriesTitle] = sName;                    // Название сериала
      Item[mpiYear       ] = sYear;                    // Запоминаем год выхода
      
    } while (RegEx.SearchAgain);
    
  } finally { RegEx.Free(); }
  
  // Сортируем в базе данных программы созданные элементы
  if (gsGroupMode==&apos;alph&apos;) {
    FolderItem.Sort(&apos;mpTitle&apos;);
    for (i=0; i&lt;FolderItem.ChildCount; i++) FolderItem.ChildItems[i].Sort(&apos;mpTitle&apos;);
  } else if (gsGroupMode==&apos;year&apos;) FolderItem.Sort(&apos;-mpYear&apos;);
  
  HmsLogMessage(1, mpTitle+&apos;: создано элементов - &apos;+IntToStr(gnTotalItems));
}

#define mpiFav 100992 // Идентификатор свойства элемента: данные папки "Избранное"
///////////////////////////////////////////////////////////////////////////////
// Создание сериалов избранного (база данных в свойстве mpiFav)
void CreateFavorites() {
  THmsScriptMediaItem Item;
  string   sData = FolderItem[mpiFav];
  TRegExpr RE    = TRegExpr.Create(&apos;&lt;n=(.*?);l=(.*?);i=(.*?);y=(.*?)&gt;&apos;);
  try {
    if (RE.Search(sData)) do {
      Item = CreateFolder(FolderItem, RE.Match(1), RE.Match(2), RE.Match(3));
      Item[mpiYear       ] = RE.Match(3);
      Item[mpiSeriesTitle] = RE.Match(1);
    } while (RE.SearchAgain());
  } finally { RE.Free; }
}

///////////////////////////////////////////////////////////////////////////////
//                     Г Л А В Н А Я   П Р О Ц Е Д У Р А                     //
{
  FolderItem.DeleteChildItems();  // Удаляем созданные ранее элементы в текущей папке
  if (LeftCopy(mpFilePath, 4)==&apos;-fav&apos;) CreateFavorites(); // Обновляем ибранное
  else LoadAndParse();            // Запускаем загрузку страниц и создание папок видео

}</Value>
    </Property>
    <Property>
      <ID>531</ID>
      <Value>C++Script</Value>
    </Property>
    <Property>
      <ID>550</ID>
      <Value>///////////////////////////////////////////////////////////////////////////////
//           By  slim8020  in  collaboration  with  WendyH  2017             //

string    gsUrlBase    = &apos;http://putlocker.co&apos;; // База для относительных ссылок
string    gsUrlScript  = &apos;http://image3.putlocker.co/show.js&apos;; // Ссылка на скипт расшифровки
int       gnTotalItems = 0;                      // Счётчик созданных элементов
TDateTime gStart       = Now;                    // Время начала запуска скрипта
string    gsTime       = "02:30:00.000";         // Продолжительность видео

// Регулярные выражения для поиска на странице блоков с информацией о видео
string gsPatternName   = &apos;&lt;h1&gt;\\S+\\s\\S+Watch\\s([^&lt;]+)\\sSeason\\s\\d+\\s\\S+&lt;\\/h1&gt;&apos;; //Название сериала
string gsPatternVLink  = &apos;setup\\(({[^;]+})\\);&apos;;  // Ссылка на видео
string gsPatternCrypt  = &apos;doit\\S{2}([^\\)]+)\\)&apos;; // Блок зашифрованных данных
string gsPatternSeason = &apos;&lt;strong&gt;Season\\s(\\d+)&lt;\\/strong&gt;&apos;;   // Сезон
string gsPatternELink  = &apos;(http:\\/\\/putlocker\\.co\\/watch-&apos;+ // Название серии и ссылка
                         &apos;\\S+-tvshow-season-\\d+-episode-\\d+-online-free-putlocker\\.html)"&apos;+
                         &apos;\\stitle="[^"]+\\sSeason\\s\\d+\\sEpisode\\s(\\d+)\\s-\\s([^"]+)"&apos;;
string gsPatternSLink  = &apos;http:\\/\\/putlocker\\.co\\/watch-&apos;+  // Номер сезона и ссылка
                         &apos;\\S+-tvshow-season-(\\d+)-online-free-putlocker\\.html&apos;;
string gsHeaders = &apos;/\r\n&apos;+                                      // HTTP заголовки для запросов
                   &apos;Accept-Encoding: gzip, deflate\r\n&apos;+
                   &apos;Origin: &apos;+gsUrlBase+&apos;\r\n&apos;+
                   &apos;User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36\r\n&apos;;

///////////////////////////////////////////////////////////////////////////////
//                                                                           //
//                   С У Б Т И Т Р Ы     № 2     ( A P I )                   //
//                                                                           //

// Константы
#define OSUA &apos;HMS Putlocker podcast v1&apos; // User-Agent for api.opensubtitles.org 
#define mpiSubtitleLink 100510          // Идентификатор свойства элемента: Ссылка для скачивания файла субтиров

///////////////////////////////////////////////////////////////////////////////
// Выполнение команды API на api.opensubtitles.org
string OSAPI(string sMethod, variant aParams, string sNameOfReturnParameter=&apos;&apos;) {
  string sParams=&apos;&apos;, sHeaders, sPost, sData; int i;
  for (i=0; i&lt;Length(aParams); i++) {
    if (Pos(&apos;&lt;array&gt;&apos;, aParams[i])&gt;0) sParams+=&apos;&lt;param&gt;&lt;value&gt;&apos;+aParams[i]+&apos;&lt;/value&gt;&lt;/param&gt;&apos;;
    else                              sParams+=&apos;&lt;param&gt;&lt;value&gt;&lt;string&gt;&apos;+aParams[i]+&apos;&lt;/string&gt;&lt;/value&gt;&lt;/param&gt;&apos;;
  }
  sHeaders = &apos;/\r\nAccept-Encoding: gzip\r\nAccept: */*\r\nUser-Agent: &apos;+OSUA+&apos;\r\n&apos;;
  sPost = Format(&apos;&lt;?xml version="1.0"?&gt;&lt;methodCall&gt;&lt;methodName&gt;%s&lt;/methodName&gt;&lt;params&gt;%s&lt;/params&gt;&lt;/methodCall&gt;&apos;, [sMethod, sParams]);
  sData = HmsSendRequest(&apos;api.opensubtitles.org&apos;, &apos;/xml-rpc&apos;, &apos;POST&apos;, &apos;text/xml; charset=utf-8&apos;, sHeaders, sPost, 80, true);
  if ((Pos(&apos;200 OK&apos;, sData)&gt;0) &amp;&amp; (sNameOfReturnParameter!=&apos;&apos;))
    if (!HmsRegExMatch(&apos;&lt;name&gt;&apos;+sNameOfReturnParameter+&apos;&lt;/name&gt;&lt;value&gt;&lt;string&gt;(.*?)&lt;/string&gt;&apos;, sData, sData)) sData = &apos;&apos;;
  return sData;
}

///////////////////////////////////////////////////////////////////////////////
// Загрузка архива субтитров с www.opensubtitles.org (в mpSeriesTitle должно быть имя сериала)
void LoadOpensubtitles(int nSeason=1) {
  string sData, sToken, sLangID, sParams, sFile, sLink, sSeason, sEpisode, sVal, sTokenFile=HmsTempDirectory+"\\os.token";
  TXMLDocument XML; TXMLItem X, XMLPARAMS, XMLITEMS; TStringList PROPS; int i, n; THmsScriptMediaItem Item;

  // Идентификатор языка: rus, eng... Если не установлен - не загружать субтитры
  if ((Trim(mpSeriesTitle)==&apos;&apos;) || !HmsRegExMatch(&apos;--subtitles=(\\w+)&apos;, mpPodcastParameters, sLangID)) return;
  // Получаем токен для работы с API
  if (FileExists(sTokenFile)) sToken = HmsStringFromFile(sTokenFile);   // Если есть сохранённый токен, загружаем его
  if (sToken==&apos;&apos;) sToken = OSAPI(&apos;LogIn&apos;, [&apos;&apos;, &apos;&apos;, &apos;&apos;, OSUA], &apos;token&apos;); // Анонимный вход под нашим User-Agent
  // Ищем субтитры по имени сериала и номеру сезона
  sParams = &apos;&lt;array&gt;&lt;data&gt;&lt;value&gt;&lt;struct&gt;&apos;+
            &apos;&lt;member&gt;&lt;name&gt;query&lt;/name&gt;&lt;value&gt;&lt;string&gt;&apos;+mpSeriesTitle+&apos;&lt;/string&gt;&lt;/value&gt;&lt;/member&gt;&apos;+
            &apos;&lt;member&gt;&lt;name&gt;sublanguageid&lt;/name&gt;&lt;value&gt;&lt;string&gt;&apos;+sLangID+&apos;&lt;/string&gt;&lt;/value&gt;&lt;/member&gt;&apos;+
            &apos;&lt;member&gt;&lt;name&gt;season&lt;/name&gt;&lt;value&gt;&lt;double&gt;&apos;+Str(nSeason)+&apos;&lt;/double&gt;&lt;/value&gt;&lt;/member&gt;&lt;/struct&gt;&lt;/value&gt;&lt;/data&gt;&lt;/array&gt;&apos;;
  sData = OSAPI(&apos;SearchSubtitles&apos;, [sToken, sParams]);
  // Если созранённый токен уже перестал действовать, то авторизуемся и делаем поиск заново
  if ((sData==&apos;&apos;) || (Pos(&apos;401 Unauthorized&apos;, sData)&gt;0)) {
    sToken = OSAPI(&apos;LogIn&apos;, [&apos;&apos;, &apos;&apos;, &apos;&apos;, OSUA], &apos;token&apos;);
    sData  = OSAPI(&apos;SearchSubtitles&apos;, [sToken, sParams]);
    if (sToken!=&apos;&apos;) HmsStringToFile(sToken, sTokenFile); // Если токен получили, сохраняем его
  }
  if (Pos(&apos;200 OK&apos;, sData)&lt;1) return;
    
  XML = TXMLDocument.Create(); PROPS = TStringList.Create();
  try {
    string sSubtitles = &apos;&apos;;
    XML.LoadFromString(sData);
    XMLPARAMS = XML.Root.Find("params\\param\\value\\struct"); if ((XMLPARAMS==nil) || (XMLPARAMS.Count&lt;2)) return;
    XMLITEMS  = XMLPARAMS.Items[1].Find("value\\array\\data");
    if (XMLITEMS!=nil) for (i=0; i&lt;XMLITEMS.Count; i++) {
      X = XMLITEMS[i].Find("struct"); if (X==nil) continue;
      // Для удобства доступа к значениям, переносим все свойства в TStrings
      for (n=0; n&lt;X.Count; n++) if (X[n].Find("value\\string")!=nil) PROPS.Values[X[n].Find("name").Value] = X[n].Find("value\\string").Value;
      if (PROPS.Values["SubFormat"]!="srt") continue; 
      sSeason  = PROPS.Values["SeriesSeason"   ];
      sEpisode = PROPS.Values["SeriesEpisode"  ];
      sLink    = PROPS.Values["ZipDownloadLink"];
      sFile    = PROPS.Values["SubFileName"    ];
      sSubtitles += Format(&apos;s%de%d=%s;&apos;, [StrToIntDef(sSeason, 0), StrToIntDef(sEpisode, 0), sLink]);
    }
    // Обход всех серий и устрановка ссылок на субтитры для найденных
    sFile = HmsSubtitlesDirectory+&apos;\\&apos;+ReplaceStr(mpSeriesTitle, &apos; &apos;, &apos;_&apos;);
    for (i=0; i&lt;PodcastItem.ChildCount; i++) {
      Item = PodcastItem.ChildItems[i];
      sVal = &apos;s&apos;+Str(Item[mpiSeriesSeasonNo])+&apos;e&apos;+Str(Item[mpiSeriesEpisodeNo]);
      if (HmsRegExMatch(sVal+&apos;=(.*?);&apos;, sSubtitles, sLink)) {
        Item[mpiSubtitleLanguage] = sFile+&apos;_&apos;+sVal+&apos;.srt&apos;;
        Item[mpiSubtitleLink    ] = sLink;
        Item[mpiTitle           ] = Trim(Item[mpiTitle])+&apos; (subs)&apos;;
      }
    }
  } finally { XML.Free; PROPS.Free; }
}

///////////////////////////////////////////////////////////////////////////////
//                                                                           //
//                  З А Г Р У З К А     К А Р Т И Н О К                      //
//                                                                           //

// Константы: собственные идентификаторы свойств элемента
#define mpiTVDBInfo       100507 // Информация с thetvdb.com (картинки и названия серий)
#define mpiNumEpisodesNow 100508 // Количество серий подсчитанные в данный момент
#define mpiNumEpisodesPre 100509 // Количество серий подсчитанные в прошлый раз

// Глобальные переменные
string gsSubtitleFiles = "";    // Собранная информация о файлах субтитров к сериям
string gsTVDBInfo      = "";    // Загруженная информация с thetvdb.com (картинки и названия серий)
bool   gbLoadPictures  = false; // Флаг: загружать информацию thetvdb.com (ключ --loadpictures)
bool   gbRusTitles     = false; // Флаг: использовать названия серий из информации с thetvdb.com (ключ --rusnames)
bool   gbSubsAPI       = false; // Флаг: использование варианта с API для загрузки субтитров с www.opensubtitles.org

///////////////////////////////////////////////////////////////////////////////
// Загрузка информации сериала с названием и картинками эпизодов
void LoadEpisodesInfo() {
  string sName;
  if (gsTVDBInfo!=&apos;&apos;) return; // Если инфа уже есть - зачем её пытаться загружать?
  // Проверяем, была ли уже загружена информация для такого количества серий
  if ((Trim(PodcastItem[mpiNumEpisodesNow])!=&apos;&apos;) &amp;&amp; (PodcastItem[mpiNumEpisodesNow]==PodcastItem[mpiNumEpisodesPre])) {
    // Если есть подсчитанное количество серий и это количество равно сохранённому значению в прошлый раз
    gsTVDBInfo = PodcastItem[mpiTVDBInfo]; // То просто достаём сохранённую инфу
    return;
  }
  sName = ReplaceStr(mpSeriesTitle, &apos; &apos;, &apos;_&apos;);
  gsTVDBInfo = HmsUtf8Decode(HmsDownloadURL(&apos;http://wonky.lostcut.net/tvdb.php?n=&apos;+sName+&apos;&amp;y=&apos;+Str(mpYear), &apos;User-Agent: HMS Putlocker.co&apos;, true));
  if (gsTVDBInfo == &apos;&apos;) gsTVDBInfo = &apos;-&apos;;                          // Если инфы нет - то и не будем потом пытаться
  PodcastItem[mpiTVDBInfo      ] = gsTVDBInfo;                     // Запоминаем инфу 
  PodcastItem[mpiNumEpisodesPre] = PodcastItem[mpiNumEpisodesNow]; // для такого количества серий
}

///////////////////////////////////////////////////////////////////////////////
// Установка реального названия и картинки для эпизода сериала из gsTVDBInfo
void SetEpisodeInfo(THmsScriptMediaItem Item, int nSeason, int nEpisode) {
  string sName, sImg;
  // Если не установлен флаг загрузки картинок - сваливаем. Если ифнормация ещё не загружена - загружаем.
  if (!gbLoadPictures ) return; if (gsTVDBInfo==&apos;&apos;) LoadEpisodesInfo();
  // Ищем в загруженной информации ссылку на картинку и имя серии
  if (HmsRegExMatch2(&apos;s&apos;+Str(nSeason)+&apos;e&apos;+Str(nEpisode)+&apos;=(.*?);t=(.*?)\\|&apos;, gsTVDBInfo, sImg, sName)) {
    if (sImg !="") Item[mpiThumbnail] = sImg; // Если картинка есть, устанавливаем
    // Если установлен флаг использования имён серий из информации - устанавливаем название (может быть на русском)
    if (gbRusTitles &amp;&amp; (sName!="")) Item[mpiTitle] = Format("%.2d %s", [nEpisode, sName]);
    Item[mpiSeriesTitle       ] = mpSeriesTitle; // Название сериала
    Item[mpiSeriesSeasonNo    ] = nSeason;       // Номер сезона
    Item[mpiSeriesEpisodeNo   ] = nEpisode;      // Номер эпизода
    Item[mpiSeriesEpisodeTitle] = sName;         // Название серии
  }
}

///////////////////////////////////////////////////////////////////////////////
//                                                                           //
//                        С У Б Т И Т Р Ы     № 1                            //
//                                                                           //

///////////////////////////////////////////////////////////////////////////////
// Загрузка субтитров с opensubtitles.org для конкретного сезона
void LoadSubtitles4Season(int nSeason) {
  string sName, sData, sHeaders, sID, sFile, sDir, sVal, sSeason, sEpisode, sLangID;
  int n; TStringList LIST; bool bDownloaded;
  
  if (gsSubtitleFiles!="") return; gsSubtitleFiles = &apos;-&apos;; // Если инфа есть - уже загружали, выходим
  // Идентификатор языка: rus, eng... Если не установлен - не загружать субтитры
  if (!HmsRegExMatch(&apos;--subtitles=(\\w+)&apos;, mpPodcastParameters, sLangID)) return;
  // В имя файла с субтритрами включаем количество серий для случая, когда нужно обновить при выходе новой серии
  sFile    = Format(&apos;%s\\%s_subs_%s_s%dx%s.zip&apos;, [HmsTempDirectory, ReplaceStr(mpSeriesTitle, &apos; &apos;, &apos;_&apos;), sLangID, nSeason, PodcastItem[mpiNumEpisodesNow]]);
  sDir     = HmsSubtitlesDirectory+&apos;\\&apos;+mpSeriesTitle;
  sHeaders = &apos;Referer: https://www.opensubtitles.org\r\nAccept-Encoding: gzip\r\nUser-Agent: HMS Putlocker podcast v1\r\n&apos;;
  bDownloaded = FileExists(sFile);
  if (!bDownloaded) {
    if (!HmsRegExMatch(&apos;tt(\\d+)&apos;, gsTVDBInfo, sID)) { // Если к этому моменту gsTVDBInfo уже загружен, там может храниться информация imdb
      sName = HmsHttpEncode(mpSeriesTitle);            // Иначе пытаемся найти ID IMDB
      sData = HmsDownloadURL(&apos;https://www.opensubtitles.org/libs/suggest.php?format=json3&amp;MovieName=&apos;+sName, sHeaders, true);
      if (!HmsRegExMatch(&apos;"pic":"(.*?)"&apos;, sData, sID)) return;
    }
    sData = HmsDownloadURL(&apos;https://www.opensubtitles.org/download/s/sublanguageid-&apos;+sLangID+&apos;/subformat-srt/pimdbid-&apos;+sID+&apos;/season-&apos;+Str(nSeason), sHeaders, true);
    bDownloaded = Trim(sData)!=&apos;&apos;;
    HmsStringToFile(sData, sFile);
  }
  if (bDownloaded) {
    if (!HmsExtractFiles(sFile, sDir)) return; // Распаковка скачанного zip архива
    LIST = TStringList.Create();
    try {
      HmsGetFileList(sDir, LIST, "*.srt");     // Получаем список распакованных файлов
      for (n=0; n&lt;LIST.Count; n++) {
        sFile = LIST[n];
        // Пытаемся получить из названия разными способами номер сезона и эпизода
        if (!HmsRegExMatch2(&apos;s(\\d+)e(\\d+)&apos;  , sFile, sSeason, sEpisode, PCRE_CASELESS)) // Внимательно! 
        if (!HmsRegExMatch2(&apos;(\\d+)x(\\d+)&apos;   , sFile, sSeason, sEpisode, PCRE_CASELESS)) // Следующий if выполняется только 
        if (!HmsRegExMatch2(&apos;(\\d+)\\w+(\\d+)&apos;, sFile, sSeason, sEpisode)) continue;      // если неудачный предыдущий
        gsSubtitleFiles += Format(&apos;s%de%d=%s;&apos;, [StrToInt(sSeason), StrToInt(sEpisode), sFile]);
      }
    } finally { LIST.Free(); }
  }
}

///////////////////////////////////////////////////////////////////////////////
// Установка для видео файла субтиров, если он есть для указаной серии
void SetSubtitleFile(THmsScriptMediaItem Item, int nSeason, int nEpisode) {
  if (gbSubsAPI) return; // Если установлен флаг использования API (ключ --subsapi), то выходим
  if (gsSubtitleFiles==&apos;&apos;) LoadSubtitles4Season(nSeason); // Загружаем субтитры, если они ещё не загружены
  // Если будет найден файл субтитров для сезона и эпизода в gsSubtitleFiles, то файл будет запомнен в Item[mpiSubtitleLanguage]
  if (HmsRegExMatch(&apos;s&apos;+Str(nSeason)+&apos;e&apos;+Str(nEpisode)+&apos;=(.*?);&apos;, gsSubtitleFiles, Item[mpiSubtitleLanguage]))
    Item[mpiTitle] = Trim(Item[mpiTitle])+&apos; (subs)&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)); // Для обратной сортировки по дате создания
  Item[100500       ] = PodcastItem[100500];
  gnTotalItems++;             // Увеличиваем счетчик созданных элементов
  return Item;                // Возвращаем созданный объект
}

///////////////////////////////////////////////////////////////////////////////
// Создание ссылки на видео
THmsScriptMediaItem CreateMediaItem(THmsScriptMediaItem Folder, string sTitle, string sLink, string sImg, string sGrp=&apos;&apos;) {
  THmsScriptMediaItem Item = HmsCreateMediaItem(sLink, Folder.ItemID, sGrp);
  Item[mpiTitle     ] = sTitle;
  Item[mpiThumbnail ] = sImg;
  Item[mpiCreateDate] = VarToStr(IncTime(gStart,0,-gnTotalItems,0,0));
  Item[mpiTimeLength] = gsTime;
  gnTotalItems++;
  return Item;
}
///////////////////////////////////////////////////////////////////////////////
// Javascript Eval 
string jsEval(string sData) {
  Variant objScript; string sResult = &apos;&apos;;
  
  try { objScript = CreateOleObject(&apos;MSScriptControl.ScriptControl&apos;); } except { };
  if (VarType(objScript) != varDispatch) { 
    HmsLogMessage(2, &apos;Не могу создать ActiveXObject MSScriptControl.ScriptControl&apos;); 
    return &apos;&apos;; 
  }
  objScript.Language = &apos;JavaScript&apos;;
  try { sResult = objScript.Eval(sData); } except { };
  return sResult;
}
///////////////////////////////////////////////////////////////////////////////
/// Получаем прямую ссылку на видео
void GetLink(string sLink) {
  String sHtml, sVal, sSubLink, sFile; int i; 
  TJsonObject JSON; TJsonArray JSONAsources, JSONAsubtitles;
  TRegExpr RE; 
  
  sHtml = HmsDownloadURL(sLink, &apos;Referer: &apos;+sLink+gsHeaders, true);
  sHtml = HmsRemoveLineBreaks(HmsUtf8Decode(sHtml));
  RE = TRegExpr.Create(gsPatternCrypt, PCRE_SINGLELINE ); // блок зашифрованных данных
  if (RE.Search(sHtml)) { 
    RE.SearchAgain; // на странице 2 блока зашфрованных данных соответствующих поиску, нам нужен 2-й
    if (Trim(RE.Match(0))==&apos;&apos;) {
      // Видео не доступно
      sVal = HmsDownloadURL("https://studio.stupeflix.com/v/egNpyqrXjAbx", &apos;Referer: &apos;+gsHeaders, True);
      HmsRegExMatch(&apos;"(http[^&gt;"]+\.mp4)&apos;, sVal, MediaResourceLink);
      sVal = PodcastItem.ItemParent.ItemParent[mpiTitle]+&apos; - &apos;+PodcastItem.ItemParent[mpiTitle]+&apos; - &apos;+mpTitle;
      HmsLogMessage(2, sVal+&apos;: Видео не доступно&apos;);
      return;
    }
    sHtml = HmsDownloadURL(gsUrlScript, &apos;Referer: &apos;+sLink+gsHeaders, true); // загружаем функцию расшифровки
    sHtml = HmsRemoveLineBreaks(HmsUtf8Decode(sHtml));
    sSubLink = ExtractWord(2, jsEval(sHtml+RE.Match(0)), &apos;"&apos;); // вытащим ссылку из расшифрованного блока
    sHtml = HmsDownloadURL(sSubLink, &apos;Referer: &apos;+sLink+gsHeaders, true);
    sHtml = HmsRemoveLineBreaks(HmsUtf8Decode(sHtml));
    RE = TRegExpr.Create(gsPatternVLink , PCRE_SINGLELINE ); // ссылки на видео [ заменить а TJson? ]
    if (RE.Search(sHtml)) {sVal = RE.Match(1);}
    JSON = TJsonObject.Create();    
    try {
      JSON.LoadFromString(sVal);
      JSONAsources = JSON.A["sources"];
      i = JSONAsources.Length-1;
      MediaResourceLink  = JSONAsources[i].S["file"];
      HmsLogMessage(1, mpTitle+&apos;: Качество - &apos;+ JSONAsources[i].S["label"]);
      PodcastItem.Properties[mpiTimeLength] = JSON.S["duration"];
      
      // ----------------------------------------------------------------------
      // Проверяем, не установлены ли субтитры, скачаны ли они и есть ли ссылка
      sFile = Trim(PodcastItem[mpiSubtitleLanguage]);
      if ((sFile!=&apos;&apos;) &amp;&amp; !FileExists(sFile) &amp;&amp; (Trim(PodcastItem[mpiSubtitleLink])!=&apos;&apos;)) {
        // Если установлены и такого файла ещё нет? то скачиваем файл субтитров по ссылке в PodcastItem[mpiSubtitleLink]
        string sDir = HmsTempDirectory+&apos;\\subs&apos;;
        sVal = HmsDownloadURL(PodcastItem[mpiSubtitleLink]); // HmsDownloadURLToFile в случае ошибки вызывает исключение,
        HmsStringToFile(sVal, sDir+&apos;.zip&apos;);                  // поэтому всё через одно место.
        if (HmsExtractFiles(sDir+&apos;.zip&apos;, sDir, true)) {      // Извлекаем из архива файлы
          TStringList FILELIST = TStringList.Create();       // Для функции HmsGetFileList создаём объект TStringList
          HmsGetFileList(sDir, FILELIST, "*.srt");           // Получаем список файлов в FILELIST
          if (FILELIST.Count&gt;0) CopyFile(FILELIST[0], sFile, false);
          FILELIST.Free();
        }
      }
      // ----------------------------------------------------------------------
      
      //JSONAsubtitles = JSON.A["tracks"];
      //for (i=0; i&lt;JSONAsubtitles.Length; i++) {
      //  if (HmsRegExMatch(&apos;(English|En|Eng)&apos;, JSONAsubtitles[i].S["label"], &apos;&apos;)) {
      //    PodcastItem[mpiSubtitleLanguage] = JSONAsubtitles[i].S["file"];
      //  }
      //}      
    } finally { JSON.Free(); }
  }
  RE.Free(); 
}  

///////////////////////////////////////////////////////////////////////////////
// Создание списка серий сериала с putlocker.co
void CreateLinks(string sLink) {
  String sHtml, sVal, sSeries ,sName, sSubLink, sSub; int n, nEpisode, intSeason;
  TRegExpr RE; THmsScriptMediaItem Item, Folder = PodcastItem;

  gbLoadPictures = Pos("--loadpictures"     , mpPodcastParameters) &gt; 0; // Флаг загрузки картинок
  gbRusTitles    = Pos("--rusnames"         , mpPodcastParameters) &gt; 0; // Флаг получения русских названий серий (если они есть)
  gbSubsAPI      = Pos("--subsapi"          , mpPodcastParameters) &gt; 0; // Флаг использования API для загрузки субтитров
  // Устанавливаем в переменную mpSeriesTitle имя сериала, если оно не установлено (для загрузки картинок и субтитров)
  if (Trim(mpSeriesTitle)==&apos;&apos;) mpSeriesTitle = IfThen(Pos(&apos;Season&apos;, mpTitle)&gt;0, PodcastItem.ItemParent[mpiTitle], mpTitle);
  
  sHtml = HmsDownloadURL(sLink, &apos;Referer: &apos;+sLink+gsHeaders, true);
  sHtml = HmsRemoveLineBreaks(HmsUtf8Decode(sHtml));
  if (HmsRegExMatch(&apos;tvshow&apos;, sLink, &apos;&apos;)) {
    RE = TRegExpr.Create(gsPatternSeason, PCRE_SINGLELINE ); // Сезоны
    // Подсчитываем количество сезонов
    n = 0; if (RE.Search(sHtml)) do { n++; sVal = RE.Match(1);} while (RE.SearchAgain);
    if (n == 1) {
      // Если сезон всего один или мы в папке сезона, выкатываем серии
      RE = TRegExpr.Create(gsPatternName, PCRE_SINGLELINE );
      if (RE.Search(sHtml)) {sSeries = RE.Match(1);}
      RE = TRegExpr.Create(gsPatternELink, PCRE_SINGLELINE );
      // Подсчитываем количество серий, чтобы запомнить в PodcastItem[mpiNumEpisodesNow] (для обновления субтитров или картинок при выходе новой серии)
      n=0; if (RE.Search(sHtml)) do n++; while (RE.SearchAgain); PodcastItem[mpiNumEpisodesNow] = Str(n);
      
      if (RE.Search(sHtml)) do {
        sSubLink = RE.Match(1);           //Ссылка на серию
        nEpisode = StrToInt(RE.Match(2)); //Номер
        sName = RE.Match(3);              //название серии
        Item  = CreateMediaItem(Folder, Format("%.2d %s", [nEpisode, sName]), sSubLink, mpThumbnail);
        SetEpisodeInfo (Item, StrToInt(sVal), nEpisode); // Устанавливаем картинку для эпизода
        SetSubtitleFile(Item, StrToInt(sVal), nEpisode); // Устанавливаем файл субтитров
      } while (RE.SearchAgain);
      if (gbSubsAPI) LoadOpensubtitles(StrToInt(sVal));
      
    } else {
      intSeason = 0;
      RE = TRegExpr.Create(gsPatternSLink, PCRE_SINGLELINE );
      if (RE.Search(sHtml)) do {
        sVal     = RE.Match(1); // Номер сезона
        sSubLink = RE.Match(0); // Ссылка на страницу сезона
        if ((intSeason!=StrToInt(sVal)) &amp;&amp; (sSubLink!=sLink)) {  
          Item = CreateFolder(Folder, &apos;Season &apos;+sVal, sSubLink, mpThumbnail);
          Item[mpiSeriesTitle] = mpTitle;
          intSeason = StrToInt(sVal);
        }
      } while (RE.SearchAgain);
    } 
    RE.Free();
    // Если мы не в конкретном сезоне, создаём папку "Добавить в избранное"
    if (Pos(&apos;Season&apos;, mpTitle)&lt;1) CreateAddDelFavoritesFolder();
  }
}

///////////////////////////////////////////////////////////////////////////////
//                                                                           //
//                    Р А Б О Т А    С    И З Б Р А Н Н Ы М                  //
//                                                                           //

#define mpiFav 100992 // Идентификатор свойства элемента: данные папки "Избранное"

///////////////////////////////////////////////////////////////////////////////
// Получение папки "Избранное"
THmsScriptMediaItem GetFavoritesFolder() {
  THmsScriptMediaItem Root = PodcastItem;              // Ищем корневой элемент подкаста
  while ((Root[mpiFilePath]!=&apos;Putlocker&apos;) &amp;&amp; (Root.ItemParent!=nil)) Root = Root.ItemParent;
  return Root.FindItemByProperty(mpiFilePath, "-Fav"); // Ищем папку "Избранное" в корневой папке
}  

///////////////////////////////////////////////////////////////////////////////
// Создание специальной папки добавления/удаления в избранное
void CreateAddDelFavoritesFolder() {
  string sVal;
  THmsScriptMediaItem Folder, FavItem = GetFavoritesFolder(); if (FavItem==nil) return;
  if (Pos(mpFilePath, FavItem[mpiFav])&lt;1) sVal = "Добавить в избранное";
  else                                    sVal = "Удалить из избранного";
  Folder = CreateFolder(PodcastItem, sVal, sVal);
  CreateMediaItem(Folder, sVal, &apos;-FavCmd&apos;, &apos;http://wonky.lostcut.net/icons/ok.png&apos;);
} 

///////////////////////////////////////////////////////////////////////////////
// Зауск команды добавления или удаления сериала в/из избранное
void AddRemoveFavoritesCmd() {
  string sData, sName, sLink, sImg, sYear, sID;
  THmsScriptMediaItem Item, Folder, FavItem=GetFavoritesFolder(); if (FavItem==nil) return;
  HmsRegExMatch(&apos;=(.*)&apos;, mpFilePath, sID);
  Item = PodcastItem.ItemOrigin.ItemParent.ItemParent; // Папка сериала, где находится команда
  sName = Item[mpiSeriesTitle];
  sLink = Item[mpiFilePath   ];
  sImg  = Item[mpiThumbnail  ];
  sYear = Item[mpiYear       ];
  // Проверяем, присутствует ли данный сериал в избранном?
  if (Pos(sLink, FavItem[mpiFav])&lt;1) {
    // Добавляем в базу данных наш сериал
    FavItem[mpiFav] += Format(&apos;&lt;n=%s;l=%s;i=%s;y=%s&gt;&apos;, [sName, sLink, sImg, sYear]);
    Folder = CreateFolder(FavItem, sName, sLink, sImg);     // Создаём наш сериал сразу
    Folder.CopyProperties(Item, [mpiYear, mpiSeriesTitle]); // Копируем свойства папки
    mpTitle = "Удалить из избранного"; // Теперь эта ссылка и папка будет отображаться так
  } else {
    // Удаляем из базы данных наш сериал
    if (HmsRegExMatch(&apos;(&lt;n=[^&gt;]+;l=&apos;+sLink+&apos;.*?&gt;)&apos;, FavItem[mpiFav], sData)) 
      FavItem[mpiFav] = ReplaceStr(FavItem[mpiFav], sData, &apos;&apos;);
    mpTitle = "Добавить в избранное";  // Теперь эта ссылка и папка будет отображаться так
  }
  PodcastItem[mpiTitle] = mpTitle;
  PodcastItem.ItemOrigin.ItemParent[mpiTitle] = mpTitle;
  HmsIncSystemUpdateID(); // Говорим устройству об обновлении содержания
  MediaResourceLink = ProgramPath()+&apos;\\Presentation\\Images\\videook.mp4&apos;;
}


///////////////////////////////////////////////////////////////////////////////
//                     Г Л А В Н А Я   П Р О Ц Е Д У Р А                     //
{
  if (PodcastItem.IsFolder) {
    PodcastItem.DeleteChildItems();
    CreateLinks(mpFilePath);
  } 
  else if (LeftCopy(mpFilePath, 4)==&apos;-Fav&apos;)       AddRemoveFavoritesCmd();
  else if (HmsFileMediaType(mpFilePath)==mtVideo) MediaResourceLink = mpFilePath;
  else GetLink(mpFilePath);
}</Value>
    </Property>
    <Property>
      <ID>551</ID>
      <Value>C++Script</Value>
    </Property>
    <Property>
      <ID>527</ID>
      <Value>--loadpictures --subtitles=rus --subsapi--group=alph--pages=50</Value>
    </Property>
  </Properties>
  <ChildItems>
    <Item>
      <ClassID>53</ClassID>
      <ItemID>bd6b610b618178dc00bc4acf16be1f71</ItemID>
      <ItemPath>http://putlocker.co/tv</ItemPath>
      <ParentID>2c22405e-3f43-4ca9-8f1b-1806ef2374da</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>TV series</Value>
        </Property>
        <Property>
          <ID>35</ID>
          <Value>42890,5134027778</Value>
        </Property>
        <Property>
          <ID>215</ID>
          <Value>4</Value>
        </Property>
        <Property>
          <ID>527</ID>
          <Value>--group=alph</Value>
        </Property>
        <Property>
          <ID>93</ID>
          <Value>42890,5134208333</Value>
        </Property>
        <Property>
          <ID>525</ID>
          <Value>42890,5280580208</Value>
        </Property>
      </Properties>
    </Item>
    <Item>
      <ClassID>51</ClassID>
      <ItemID>e8f68203-d3f6-48aa-9975-01b9b3cae9e0</ItemID>
      <ItemPath></ItemPath>
      <ParentID>2c22405e-3f43-4ca9-8f1b-1806ef2374da</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>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>570</ID>
          <Value>0</Value>
        </Property>
        <Property>
          <ID>245</ID>
          <Value>e8f68203-d3f6-48aa-9975-01b9b3cae9e0</Value>
        </Property>
        <Property>
          <ID>93</ID>
          <Value>42890,5248803819</Value>
        </Property>
      </Properties>
      <ChildItems></ChildItems>
    </Item>
  </ChildItems>
</HmsMediaItem>
