<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Неофициальный форум DLNA Home Media Server &mdash; Просмотр потока со спутникового ресивера через HMS]]></title>
		<link>https://hms.lostcut.net/viewtopic.php?id=575</link>
		<atom:link href="https://hms.lostcut.net/extern.php?action=feed&amp;tid=575&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «Просмотр потока со спутникового ресивера через HMS».]]></description>
		<lastBuildDate>Tue, 09 Oct 2018 07:22:40 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: Просмотр потока со спутникового ресивера через HMS]]></title>
			<link>https://hms.lostcut.net/viewtopic.php?pid=13114#p13114</link>
			<description><![CDATA[<p>Ещё одна хотелка нарисовалась. При обновлении содержимого пользовательских пакетов на ресивере, содержимое в HMS не обновляется. Можно руками выполнить скрипт на сервере, тогда всё содержимое удаляется и устройства запрашивают обновление заново. А можно приделать &quot;кнопку&quot; обновить с устройства, что бы по запросу выполнялся скрипт основной папки?</p>]]></description>
			<author><![CDATA[null@example.com (fctsu001)]]></author>
			<pubDate>Tue, 09 Oct 2018 07:22:40 +0000</pubDate>
			<guid>https://hms.lostcut.net/viewtopic.php?pid=13114#p13114</guid>
		</item>
		<item>
			<title><![CDATA[Re: Просмотр потока со спутникового ресивера через HMS]]></title>
			<link>https://hms.lostcut.net/viewtopic.php?pid=13059#p13059</link>
			<description><![CDATA[<div class="quotebox"><cite>fctsu001 пишет:</cite><blockquote><p>Куда делся автор программы? Как я понимаю, он проект закрыл?</p></blockquote></div><p>Неизвестно.<br /></p><div class="quotebox"><cite>fctsu001 пишет:</cite><blockquote><p>А исходники не доступны?</p></blockquote></div><p>Нет. Это бесплатная версия для стран СНГ, для запада у него платная <a href="http://www.wildmediaserver.com">http://www.wildmediaserver.com</a>.<br />Та версия обновлялась в этом году (в отличии от HMS). Пусть нумерация версий не смущает, она всегда была разной (там и тут).<br /></p><div class="quotebox"><cite>fctsu001 пишет:</cite><blockquote><p>Сейчас остался текущий вопрос, как сделать так, что бы в скрипт обработки по событию писался тот же адрес устройства, что и в динамическую папку?</p></blockquote></div><p>Только в самом скрипте обработки каким-то образом определять, что это обрабатывается ссылка, относящаяся к нашему устройству (ресиверу) - и из этой ссылки брать сохранённое значение адреса или имени устройства. Дополнительные значения можно сохранять в поля свойств при создании ссылки.<br /></p><div class="codebox"><pre><code>  THmsScriptMediaItem Item = HMSCreateMediaItem(DevWebAddress+&#039;:8001/&#039;+sRef, FolderCat.ItemId); // Добавляем ссылку (канал)
  Item[mpiTitle] = CHANNEL.ChildValues[&#039;e2servicename&#039;]; // Название канала
  Item[12345] = &#039;DreamBox&#039;; // magic word</code></pre></div><p>А в скрипте проверять это значение. Если это ссылка, относится к нашему устройству, то получить его адрес или имя. Например, скрипт обработки события может быть таким:<br /></p><div class="codebox"><pre><code>{
  // Проверяем, это запустили на просмотр ссылку канала с тюнера?
  if (CurrentMediaItem[12345]==&#039;DreamBox&#039;) {
    string ref     = &quot;&quot;;
    string devAddr = &quot;&quot;;
    // Получаем значения адреса (или имени) устройства и serviceReference
    HmsRegExMatch2(&#039;http://(.*?):?\\d*/(.*)&#039;, CurrentMediaItem[mpiFilePath], devAddr, ref);
    string currentChannel = &quot;&quot;;
    string xmlSubservices = HmsDownloadURL(&#039;http://&#039;+devAddr+&#039;/web/subservices&#039;);
    HmsRegExMatch(&#039;&lt;e2servicereference&gt;(.*?)&lt;/e2servicereference&gt;&#039;, xmlSubservices, currentChannel);
    // Проверяем и переключаем только если текущий канал не тот, что нужен
    if (ref != currentChannel)
      HmsDownloadURL(&#039;http://&#039;+devAddr+&#039;/web/zap?sRef=&#039;+ref); // переключить тюнер на нужный канал
  }
}</code></pre></div><p>Там в регулярке, порт после двоеточия заменил на \d* - это значит любые цифры. Т.е. любой порт.<br /></p><div class="quotebox"><cite>fctsu001 пишет:</cite><blockquote><p>И, можно ли по имени устройства определить его IP, что бы использовать его?</p></blockquote></div><p>Это излишне. Этим занимается система. Если есть такой способ, то это сможет и система. Т.е. зачем указывать IP, если он и по имени будет работать. Если нет, то узнать будет невозможно.<br /></p><div class="quotebox"><cite>fctsu001 пишет:</cite><blockquote><p>Ещё один предмет для размышления, организовать стандартный путь до пиконов, или сделать возможность ввести его при импорте?</p></blockquote></div><p>Забудьте про возможность ввести при импорте. Это невозможно, точнее программа не умеет спрашивать.<br /></p><div class="quotebox"><cite>fctsu001 пишет:</cite><blockquote><p>Варианты: <br /></p><ul><li><p>хранить пиконы по пути каталогов исполняемого файла. Минус - нет доступа пользователя.<br />хранить путь др пиконов в реестре windows, искал раздел HMS - не нашёл, создавать?<br />хранить в AppData (&quot;%localappdata%\home media server\hms\thumbnails&quot;), но тогда их нужно туда импортировать как то.</p></li></ul><p>Есть ещё варианты?<br />upd: решил хранить в AppData</p></blockquote></div><p>Мне трудно давать советы по пиконам, не имея устройства, чтобы экспериментировать. Я бы просто комментарий динамической папки вставил ключи, типа:<br />--piconsPath=&quot;%localappdata%\picons&quot;<br />с возможностью указать там любой путь, кому какой вздумается.<br />А в коде папки брать это значение из переменной mpComment:<br /></p><div class="codebox"><pre><code>  piconsPath = &quot;&quot;;
  HmsRegExMatch(&#039;--piconsPath=&quot;(.*?)&quot;&#039;, mpComment, piconsPath);</code></pre></div><div class="quotebox"><cite>fctsu001 пишет:</cite><blockquote><p>Осталось придумать что то с установкой профиля транскодирования для конкретного устройства.</p></blockquote></div><p>Да. И я тут немного опять в замешательстве. Нажав правой кнопкой мыши на папке &quot;Интернет телевидение&quot; я добавил папку выбрав &quot;Добавить коллекцию фильмов&quot;, задав при этом тип &quot;Динамическая (скрипт) - зависимая от устройства&quot;. Добавил туда тупо команды вывода в журнал лога значений переменных cfgTranscodingTvsetFileFormat и cfgTranscodingTvsetMimeType.<br /></p><div class="codebox"><pre><code>  HmsLogMessage(3, mpTitle+&#039;: cfgTranscodingTvsetFileFormat=&#039;+cfgTranscodingTvsetFileFormat);
  HmsLogMessage(3, mpTitle+&#039;: cfgTranscodingTvsetMimeType=&#039;+cfgTranscodingTvsetMimeType);</code></pre></div><p>При этом заранее изменив для устройства &quot;Anroid, UPnP/1.1, MiniUPnPc/2.0&quot; в настройках расширение и MIME-тип для Интернет-ТВ. Чтобы посмотреть и убедится, что заходя с телефона (VLC for Android) увидеть, будут ли значения из настроек устройства.<br />И видел, что они были именно другие. Т.е. те, которые я установил. Теперь можно было в коде сделать проверку и принудительно установить своеобразный профиль для создаваемых ссылок.<br />Потом не знаю что сделал и опять у меня эти значения потом содержали всё те же значения по-умолчанию.<br />Хотя вот сейчас опять проверил - получилось. Т.е. профиль транскодирования устанавливается разный для разных устройств.<br />Вот такой скрипт сейчас примерно сделал:<br /></p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header" data-lang-open="открыть спойлер" data-lang-close="скрыть спойлер"><strong>+</strong>&nbsp;открыть спойлер</div><div class="fancy_spoiler"><div class="codebox"><pre><code>{
  string piconsPath = &quot;&quot;; // Путь к пиконам
  string devAddr    = &quot;&quot;; // Имя или IP адрес устройства
  string tvFileExt  = &quot;&quot;; // Расширение файла в разделе &quot;Интернет-ТВ&quot; в настройках устройства (для телевизоров Sony)
  
  // Получаем значения настроек из ключей в комментарии
  HmsRegExMatch(&#039;--piconsPath=&quot;(.*?)&quot;&#039;, mpComment, piconsPath);
  HmsRegExMatch(&#039;--deviceAddr=&quot;(.*?)&quot;&#039;, mpComment, devAddr   );
  HmsRegExMatch( &#039;--tvFileExt=&quot;(.*?)&quot;&#039;, mpComment, tvFileExt );
  
  HmsLogMessage(3, mpTitle+&#039;: cfgTranscodingTvsetFileExt=&#039; +cfgTranscodingTvsetFileExt ); // debug
  HmsLogMessage(3, mpTitle+&#039;: cfgTranscodingTvsetMimeType=&#039;+cfgTranscodingTvsetMimeType);

  FolderItem.DeleteChildItems();
  
  string xmlText = HmsDownloadURL(&#039;http://&#039; + devAddr + &#039;/web/getallservices&#039;); // Загружаем инфу о всех категориях и каналах
  //string xmlText = HmsStringFromFile(&#039;D:\\allservices.xml&#039;); // local test
  
  TXMLDocument XML = TXMLDocument.Create();
  XML.LoadFromString(xmlText);
  
  for (int nCat=0; nCat &lt; XML.Root.Count; nCat++) {
    TXMLItem CATEGORY = XML.Root[nCat];
    
    TXMLItem ChLIST = CATEGORY.Find(&#039;e2servicelist&#039;);
    if (ChLIST == nil) continue; // Если категория не содержит каналов, пропускаем
    
    string refCategory = Trim(CATEGORY.ChildValues[&#039;e2servicereference&#039;]);
    
    THmsScriptMediaItem FolderCat = FolderItem.AddFolder(&#039;http://&#039; + devAddr + &#039;/web/getservices?sRef=&#039;+HmsHttpEncode(refCategory), false, 32);
    FolderCat[mpiTitle] = CATEGORY.ChildValues[&#039;e2servicename&#039;];
    
    // Цикл создания списка каналов в папке категории
    for (int nChan=0; nChan &lt; ChLIST.Count; nChan++) {
      TXMLItem CHANNEL = ChLIST.Items[nChan];
      
      if (Trim(CHANNEL.ChildValues[&#039;e2servicename&#039;]) == &#039;&lt;n/a&gt;&#039;) continue;
      string ref = Trim(CHANNEL.ChildValues[&#039;e2servicereference&#039;]);
      
      THmsScriptMediaItem Item = HMSCreateMediaItem(&#039;http://&#039; + devAddr + &#039;:8001/&#039;+ref, FolderCat.ItemId); // Добавляем ссылку (канал)
      Item[mpiTitle    ] = CHANNEL.ChildValues[&#039;e2servicename&#039;]; // Название канала
      Item[mpiThumbnail] = piconsPath + LeftCopy(ReplaceStr(ref,&#039;:&#039;,&#039;_&#039;),Length(ref)-1)+&#039;.png&#039;;
      Item[12345       ] = &#039;DreamBox&#039;;
      // Устанавливаем принудительно профиль транскодирования
      if (cfgTranscodingTvsetFileFormat == tvFileExt) 
        Item[mpiTranscodingProfile] = &quot;Интернет-телевидение&quot;;                 // для телевизоров Sony
      else
        Item[mpiTranscodingProfile] = &quot;Интернет-телевидение (Входной поток)&quot;; // Для всех остальных
    }
    
  }
  XML.Free();
}</code></pre></div></div></div><p>Ври этом в комментарии папки такая строка: --piconsPath=&quot;%localappdata%\picons&quot; --deviceAddr=&quot;DM800&quot; --tvFileExt=&quot;ts&quot;<br />Код обработки события я приводил выше для такого варианта.<br /></p><div class="quotebox"><cite>fctsu001 пишет:</cite><blockquote><p>Кстати, в интерфейсе HMS можно установить профиль на всю папку, а можно ли сделать так с устройства?</p></blockquote></div><p>Нет.</p><p>P.S. Отредактировал скрипт. Там закралась ошибка. Вместо cfgTranscodingTvsetFileFormat нужно использовать cfgTranscodingTvsetFileExt (если мы говорим про расширение файлов типа ts, mpg или avi. А если как было, то нужно проверять на &quot;MPEG (DVD)&quot;, &quot;MPEGTS&quot;.<br />Поправил.</p>]]></description>
			<author><![CDATA[null@example.com (WendyH)]]></author>
			<pubDate>Fri, 05 Oct 2018 17:22:41 +0000</pubDate>
			<guid>https://hms.lostcut.net/viewtopic.php?pid=13059#p13059</guid>
		</item>
		<item>
			<title><![CDATA[Re: Просмотр потока со спутникового ресивера через HMS]]></title>
			<link>https://hms.lostcut.net/viewtopic.php?pid=13037#p13037</link>
			<description><![CDATA[<p>Куда делся автор программы? Как я понимаю, он проект закрыл? </p><p>Прикрутил вывод в лог cfgTranscodingTvsetFileFormat и cfgTranscodingTvsetFileExt при переключении каналов, но сейчас сонька не доступна. upd: формат файла одинаковый на устройствах, MPEG(DVD) расширение .ts.<br />В настройках устройства .mpg.<br />От профиля транскодирования не зависит (тестирую на 2- профилях, ИТ (входной поток) и Фильмы VLC-FFMPEG), профиль меняется исключительно с устройства. Изменение профиля в настройках устройства не помогает.</p><p>А исходники не доступны?</p><p>Туда же ставил вывод инфо по устройствам - инфо по устройствам выдаётся, но инфа по медиа - не той, что запрашивается, а той, что под текущим указателем в плеере, там список ранее добавленных. upd: информация берётся с плеера, в момент начала воспроизведения нет информации о воспроизводимом ресурсе, поскольку воспрооизведение не началось. Поставил запуск информации об устройствах по кнопке и выяснил это. При воспроизведении формат файла MPEG(DVD), расшитение .ts, но при этом для соньки VLC транскодирует. По большому счёту, совершенно не важно, какое там расширение и контейнер, лишь бы кодек был нужный.</p><p>Самое интересное, что при тестовом транскодировании каналы не переключаются, т.е. нет события. Так же, при тестовом транскодировании не применяются профили, установленные с устройства (через DLNA интерфейс).</p><p>Залез в скрипт запуска транскодера vlc-ffmpeg и добавил в параметры запуска vlc --ffmpeg-fast --sout-ffmpeg-hurry-up --high-priority --postproc-q=0 к тем, что там уже есть, перестал рваться поток при запуске просмотра на соньке. Изменений в качестве не заметил, но источник был не очень - кино шло.<br />upd: изменения не сохранились. Ещё раз внёс изменения. Показывает со сменой кадра раз в 2 секунды. Откатил. Не помогло. </p><p>Сейчас остался текущий вопрос, как сделать так, что бы в скрипт обработки по событию писался тот же адрес устройства, что и в динамическую папку?<br />И, можно ли по имени устройства определить его IP, что бы использовать его?</p><p>Импортировал moonwalk2, всё работает.<br />Прикрутил переключение каналов к Запуск_в_VLC</p><p>PS прицепил пиконы каналов.<br />Пытался найти ресурс, с которого можно скачать отдельно каждый, но не нашёл, нашёл только архивы с пиконами.<br />Пиконы в виде файлов вида: 1_0_19_4E89_14_70_1680000_0_0_0.png<br /></p><div class="codebox"><pre><code>        Item[Thumbnail] = &#039;H:\\Media\\Workdata\\Setup\\HomeServerDLNA\\picons\\36E_220 х132_0\\&#039; + LeftCopy(ReplaceStr( sRef,&#039;:&#039;,&#039;_&#039;),Length(sRef)-1)+&#039;.png&#039;;</code></pre></div><p>Ещё один предмет для размышления, организовать стандартный путь до пиконов, или сделать возможность ввести его при импорте?</p><p>Варианты: <br /></p><ul><li><p>хранить пиконы по пути каталогов исполняемого файла. Минус - нет доступа пользователя.<br />хранить путь др пиконов в реестре windows, искал раздел HMS - не нашёл, создавать?<br />хранить в AppData (&quot;%localappdata%\home media server\hms\thumbnails&quot;), но тогда их нужно туда импортировать как то.</p></li></ul><p>Есть ещё варианты?<br />upd: решил хранить в AppData</p><p>Пока получилось так:</p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header" data-lang-open="открыть спойлер" data-lang-close="скрыть спойлер"><strong>+</strong>&nbsp;открыть спойлер</div><div class="fancy_spoiler"><div class="codebox"><pre><code>#define DevAddresFile &#039;\\Home Media Server\\HMS\\ReceiverNetName.conf&#039;
#define TumbnailsStorePath &#039;\\Home Media Server\\HMS\\Thumbnails\\&#039;
{
  /*  string sScript = // Скрипт динамической папки конкретного канала
  &#039;{\r\n&#039;+
  &#039;  // string sLink = &quot;http://dm800:8001/{ref}&quot;;\r\n&#039;+
  &#039;  // string sLink = HmsDownloadURL(mpFilePath); // получаем ссылку на поток\r\n&#039;+
  &#039;  // THmsScriptMediaItem Item = HmsCreateMediaItem(sLink, FolderItem.ItemID); // Создаём ссылку\r\n&#039;+
  &#039;  THmsScriptMediaItem Item = HmsCreateMediaItem(&quot;http://dm800:8001/{ref}&quot;, FolderItem.ItemID); // Создаём ссылку\r\n&#039;+
  &#039;  Item[mpiTitle] = mpTitle; // присваиваем название канала как у папки\r\n&#039;+
  &#039;  Item[mpiTranscodingProfile] = &quot;Интернет-телевидение (Входной поток)&quot;; // Устанавливаем принудительно профиль транскодирования\r\n&#039;+
  &#039;  HmsDownloadURL(&quot;http://dm800/web/zap?sRef={ref}&quot;); // переключаем на канал\r\n&#039;+
  &#039;}&#039;;
  */  
  
  FolderItem.DeleteChildItems();
  string DevAddress  = HmsStringFromFile(SpecialFolderPath(0x1C) + DevAddresFile); //0x1C (CSIDL_LOCAL_APPDATA) - локальная папка данных 
  if(DevAddress != &#039;&#039;) {
  CurrentMediaItem[mpiFilePath] = DevAddress;
  
  string xmlText = HmsDownloadURL(&#039;http://&#039; + DevAddress + &#039;/web/getallservices&#039;); // Загружаем инфу о всех категориях и каналах
  //string xmlText = HmsStringFromFile(&#039;D:\\allservices.xml&#039;); // local test
  
  TXMLDocument XML = TXMLDocument.Create();
  XML.LoadFromString(xmlText);
  
  for (int nCat=0; nCat &lt; XML.Root.Count; nCat++) {
    TXMLItem CATEGORY = XML.Root[nCat];
    
    TXMLItem ChLIST = CATEGORY.Find(&#039;e2servicelist&#039;);
    if (ChLIST == nil) continue; // Если категория не содержит каналов, пропускаем
      string sRefCategory = Trim(CATEGORY.ChildValues[&#039;e2servicereference&#039;]);
    
    THmsScriptMediaItem FolderCat = FolderItem.AddFolder(&#039;http://&#039; + DevAddress + &#039;/web/getservices?sRef=&#039;+HmsHttpEncode(sRefCategory), false, 32);
    FolderCat[mpiTitle] = CATEGORY.ChildValues[&#039;e2servicename&#039;];
    
    // Цикл создания списка каналов в папке категории
    for (int nChan=0; nChan &lt; ChLIST.Count; nChan++) {
      TXMLItem CHANNEL = ChLIST.Items[nChan];
      
      if (Trim(CHANNEL.ChildValues[&#039;e2servicename&#039;]) == &#039;&lt;n/a&gt;&#039;) continue;
      string sRef = Trim(CHANNEL.ChildValues[&#039;e2servicereference&#039;]);
      
      //  THmsScriptMediaItem Item = FolderCat.AddFolder(&#039;http://&#039; + DevAddress + &#039;/web/stream.m3u?ref=&#039;+HmsHttpEncode(sRef), false, 32); // Добавляем что?
      THmsScriptMediaItem Item = HMSCreateMediaItem(&#039;http://&#039; + DevAddress + &#039;:8001/&#039;+sRef, FolderCat.ItemId); // Добавляем ссылку (канал)
      //  
      Item[mpiTitle] = CHANNEL.ChildValues[&#039;e2servicename&#039;]; // Название канала
      //  Item.ThumbnailExists= true;
      Item[mpiThumbnail] = SpecialFolderPath(0x1C) + TumbnailsStorePath + LeftCopy(ReplaceStr( sRef,&#039;:&#039;,&#039;_&#039;),Length(sRef)-1)+&#039;.png&#039;;
      
    //  Item[mpiTranscodingProfile] = cfgPreTranscodingProfile; // Устанавливаем принудительно профиль транскодирования
      Item[mpiTranscodingProfile] = &quot;Интернет-телевидение (Входной поток)&quot;; // Устанавливаем принудительно профиль транскодирования
    //  Item[200] = 1;                                  // mpiFolderType 1 - &quot;динамическая (скрипт)&quot;
    //  Item[500] = ReplaceStr(sScript, &#039;{ref}&#039;, sRef); // mpiDynamicScript
    //  Item[501] = &#039;C++Script&#039;;                        // mpiDynamicSyntaxType
    }
    
  }
  
  XML.Free();
  }
}</code></pre></div></div></div><p>Обработка на запуск воспроизведения:</p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header" data-lang-open="открыть спойлер" data-lang-close="скрыть спойлер"><strong>+</strong>&nbsp;открыть спойлер</div><div class="fancy_spoiler"><div class="codebox"><pre><code>#define DevAddresFile &#039;\\Home Media Server\\HMS\\ReceiverNetName.conf&#039;
{
  string DevAddress  = HmsStringFromFile(SpecialFolderPath(0x1C) + DevAddresFile); //0x1C (CSIDL_LOCAL_APPDATA) - локальная папка данных 
  if(DevAddress != &#039;&#039;) {
    string serviceReference = &quot;&quot;;
    // Проверяем, это запустили на просмотр ссылку канала с тюнера?
    if (HmsRegExMatch(DevAddress+&#039;:8001/(.*)&#039;, CurrentMediaItem[mpiFilePath], serviceReference)) {
      string currentChannel = &quot;&quot;;
      string xmlSubservices = HmsDownloadURL(&#039;http://&#039;+DevAddress+&#039;/web/subservices&#039;);
      HmsRegExMatch(&#039;&lt;e2servicereference&gt;(.*?)&lt;/e2servicereference&gt;&#039;, xmlSubservices, currentChannel);
      // Проверяем и переключаем только если текущий канал не тот, что нужен
      if (serviceReference != currentChannel) {
        HmsLogMessage(3, &#039;Gotcha! : &#039;+CurrentMediaItem[mpiTitle] + &#039; |&#039; + cfgTranscodingTvsetFileFormat + &#039;.&#039; + cfgTranscodingTvsetFileExt);
        HmsDownloadURL(&#039;http://&#039;+DevAddress+&#039;/web/zap?sRef=&#039;+serviceReference); // переключить тюнер на нужный канал
      }  
    }
  }
}</code></pre></div></div></div><p>Есть предложение привести все имена переменных и констант к &quot;принятому&quot; виду, ну и текст тоже.<br />Осталось придумать что то с установкой профиля транскодирования для конкретного устройства.<br />С учётом того, что все современные устройства могут переваривать спутниковый поток без транскодирования, некая универсальность остаётся. Для устройств, которые это не могут, пока один выход - устанавливать профиль транскодирования руками для каждого ресурса.<br />Кстати, в интерфейсе HMS можно установить профиль на всю папку, а можно ли сделать так с устройства?</p>]]></description>
			<author><![CDATA[null@example.com (fctsu001)]]></author>
			<pubDate>Thu, 04 Oct 2018 00:12:14 +0000</pubDate>
			<guid>https://hms.lostcut.net/viewtopic.php?pid=13037#p13037</guid>
		</item>
		<item>
			<title><![CDATA[Re: Просмотр потока со спутникового ресивера через HMS]]></title>
			<link>https://hms.lostcut.net/viewtopic.php?pid=13036#p13036</link>
			<description><![CDATA[<p>Я был не прав. Проверил, действительно, ссылки в динамической папке всегда транскодятся с профилем &quot;Фильмы (основной)&quot; и никак настройки устройств на это не влияют. Какой-то недостаток программы. Это косяк.<br />Что примечательно, если <span class="bbu">не</span> использовать динамическую папку, то ссылки в папке &quot;Интернет телевидение&quot; начинают транскодироваться с профилем, указанным в настройках устройства.</p><p>Поэтому выход один, <strong>fctsu001</strong> вы правы, принудительно устанавливать профиль транскодирования в коде.<br />Осталось определить с какого устройства зашли.<br />Но и тут облом.<br />Я так и не смог определить точное название или какие-либо данные устройства программно, точнее связать текущее устройство с тем, что может выдать THmsScriptUPnPDeviceList DeviceList = THmsScriptUPnPDeviceList.Create(udtDeviceMediaRenderer).</p><p>Даже не нашёл хоть как можно связать совсем непонятную функцию HmsClientID() хоть с чем-то. Какой-то ид можно получить, но что с ним делать - непонятно.</p><p>В итоге, вижу пока только один выход: определить можно косвенно.<br />Хоть cfgPreTranscodingProfile в динамической папке всегда пустой, но такие переменные как<br />cfgTranscodingFileFormat - формат файла (&quot;MPEG (DVD)&quot;, &quot;MPEGTS&quot;...)<br />cfgTranscodingVideoMimeType - MIME-тип файлов видео (&quot;video/mpeg&quot;, &quot;video/mp4&quot;...)<br />cfgTranscodingScreenWidth - ширина кадра<br />cfgTranscodingTvsetFileExt - расширение файлов интернет-телевидения (&quot;mp4&quot;, &quot;mpeg&quot;)<br />cfgTranscodingTvsetFileFormat - формат файлов интернет-телевидения (&quot;MPEG (DVD)&quot;, &quot;MPEGTS&quot;...)<br />всё-таки содержат значения из настроек устройства в разделе &quot;Транскодер&quot;.</p><p>Поэтому, если у одного телека одни значения, а у другого другие, то в коде можно это проверить и выставить профиль соответственно.<br />Типа такого:<br /></p><div class="codebox"><pre><code>  THmsScriptMediaItem Item = HMSCreateMediaItem(DevWebAddress+&#039;:8001/&#039;+sRef, FolderCat.ItemId); // Добавляем ссылку (канал)
  Item[mpiTitle] = CHANNEL.ChildValues[&#039;e2servicename&#039;]; // Название канала
  if (cfgTranscodingTvsetFileFormat ==&quot;MPEG (DVD)&quot;)
    Item[mpiTranscodingProfile] = &quot;Интернет-телевидение (Входной поток)&quot;; // Устанавливаем принудительно профиль транскодирования
  else
    Item[mpiTranscodingProfile] = &quot;Интернет-телевидение&quot;; // Устанавливаем принудительно профиль транскодирования</code></pre></div><p>Конечно, об универсальности говорить не приходится с таким подходом.</p>]]></description>
			<author><![CDATA[null@example.com (WendyH)]]></author>
			<pubDate>Wed, 03 Oct 2018 22:06:59 +0000</pubDate>
			<guid>https://hms.lostcut.net/viewtopic.php?pid=13036#p13036</guid>
		</item>
		<item>
			<title><![CDATA[Re: Просмотр потока со спутникового ресивера через HMS]]></title>
			<link>https://hms.lostcut.net/viewtopic.php?pid=13018#p13018</link>
			<description><![CDATA[<div class="quotebox"><cite>WendyH: пишет:</cite><blockquote><p>Предлагаю брать его из поля &quot;Путь&quot; динамической папки.<br />Т.е. в скрипте это будет переменная mpFilePath.</p></blockquote></div><p>Да, надо так и делать, только с путём в папке надо разобраться. ( PS: столкнулся с проблемой - а в обработки по событию откуда брать DevAddress? Мы же по нему определяем, что запущен нужный ресурс? Если меняем адрес в динамической папке, то и в обработке надо менять.)<br />Как сейчас, не совсем удобно. Я пока не разбирался, что там в сети происходит, но, судя по всему, адрес dm800 получается по WINS (по крайней мере на роутере я статическую запись в DNS не создавал, а в DNS серевера не помню, лет 5 назад настраивал). <br />По такому адресу обращение к ресурсу происходит чуть медленнее, по IP чуть быстрее. Кроме того, при запуске тестового транскодирования в задании транскодирования в окне CMD vlc не находит путь http://dm800, а по IP находит. Поэтому, лучше, что бы папка называлась именем устройства, а путь был с IP-адресом.<br />Сейчас в динамической папке путь и название совпадают. Можно в скрипте инициализации сделать resolve по имени и внести в путь IP адрес. ? Можно сделать вычисление IP адреса?</p><div class="quotebox"><cite>WendyH пишет:</cite><blockquote><div class="codebox"><pre><code>    THmsScriptUPnPDevice Device = DeviceList.Items[i];
    string urlDescr = Device.Properties[udpDescriptionURL];
    string img      = Device.Properties[udpDeviceIconURL ];
    string name     = Device.Properties[udpFriendlyName  ];
    string ip       = Device.Properties[udpIpAddress     ];
    string MAC      = Device.Properties[udpMacAddress    ];</code></pre></div></blockquote></div><p>Это я видел, нужен параметр устройства PreTranscodingProfile, сам найти не смог.</p><div class="quotebox"><cite>WendyH пишет:</cite><blockquote><p>Покажите, какой у вас сейчас код динамической папки, что именно хочется ещё реализовать и получается ли?</p></blockquote></div><p>Текущий скрипт в динамической папке, (скопировал с работающего сервера).</p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header" data-lang-open="открыть спойлер" data-lang-close="скрыть спойлер"><strong>+</strong>&nbsp;открыть спойлер</div><div class="fancy_spoiler"><div class="codebox"><pre><code>{
/*  string sScript = // Скрипт динамической папки конкретного канала
  &#039;{\r\n&#039;+
  &#039;  // string sLink = &quot;http://dm800:8001/{ref}&quot;;\r\n&#039;+
  &#039;  // string sLink = HmsDownloadURL(mpFilePath); // получаем ссылку на поток\r\n&#039;+
  &#039;  // THmsScriptMediaItem Item = HmsCreateMediaItem(sLink, FolderItem.ItemID); // Создаём ссылку\r\n&#039;+
  &#039;  THmsScriptMediaItem Item = HmsCreateMediaItem(&quot;http://dm800:8001/{ref}&quot;, FolderItem.ItemID); // Создаём ссылку\r\n&#039;+
  &#039;  Item[mpiTitle] = mpTitle; // присваиваем название канала как у папки\r\n&#039;+
  &#039;  Item[mpiTranscodingProfile] = &quot;Интернет-телевидение (Входной поток)&quot;; // Устанавливаем принудительно профиль транскодирования\r\n&#039;+
  &#039;  HmsDownloadURL(&quot;http://dm800/web/zap?sRef={ref}&quot;); // переключаем на канал\r\n&#039;+
  &#039;}&#039;;
*/  
  FolderItem.DeleteChildItems();
  
  string DevWebAddress = &#039;http://192.168.34.100&#039;;
  string xmlText = HmsDownloadURL(DevWebAddress+&#039;/web/getallservices&#039;); // Загружаем инфу о всех категориях и каналах
  //string xmlText = HmsStringFromFile(&#039;D:\\allservices.xml&#039;); // local test

  TXMLDocument XML = TXMLDocument.Create();
  XML.LoadFromString(xmlText);
  
  for (int nCat=0; nCat &lt; XML.Root.Count; nCat++) {
    TXMLItem CATEGORY = XML.Root[nCat];

    TXMLItem ChLIST = CATEGORY.Find(&#039;e2servicelist&#039;);
    if (ChLIST == nil) continue; // Если категория не содержит каналов, пропускаем
    string sRefCategory = Trim(CATEGORY.ChildValues[&#039;e2servicereference&#039;]);
    
    THmsScriptMediaItem FolderCat = FolderItem.AddFolder(DevWebAddress+&#039;/web/getservices?sRef=&#039;+HmsHttpEncode(sRefCategory), false, 32);
    FolderCat[mpiTitle] = CATEGORY.ChildValues[&#039;e2servicename&#039;];
    
    // Цикл создания списка каналов в папке категории
    for (int nChan=0; nChan &lt; ChLIST.Count; nChan++) {
      TXMLItem CHANNEL = ChLIST.Items[nChan];
      
      if (Trim(CHANNEL.ChildValues[&#039;e2servicename&#039;]) == &#039;&lt;n/a&gt;&#039;) continue;
      string sRef = Trim(CHANNEL.ChildValues[&#039;e2servicereference&#039;]);
      
    //  THmsScriptMediaItem Item = FolderCat.AddFolder(DevWebAddress+&#039;/web/stream.m3u?ref=&#039;+HmsHttpEncode(sRef), false, 32); // Добавляем что?
      THmsScriptMediaItem Item = HMSCreateMediaItem(DevWebAddress+&#039;:8001/&#039;+sRef, FolderCat.ItemId); // Добавляем ссылку (канал)
    //  
      Item[mpiTitle] = CHANNEL.ChildValues[&#039;e2servicename&#039;]; // Название канала
    //  Item[mpiTranscodingProfile] = cfgPreTranscodingProfile; // Устанавливаем принудительно профиль транскодирования
      Item[mpiTranscodingProfile] = &quot;Интернет-телевидение (Входной поток)&quot;; // Устанавливаем принудительно профиль транскодирования
    //  Item[200] = 1;                                  // mpiFolderType 1 - &quot;динамическая (скрипт)&quot;
    //  Item[500] = ReplaceStr(sScript, &#039;{ref}&#039;, sRef); // mpiDynamicScript
    //  Item[501] = &#039;C++Script&#039;;                        // mpiDynamicSyntaxType
    }
    
  }
  
  XML.Free();
}</code></pre></div></div></div><p>Пока большое желание допилить установку профиля транскодирования.<br />По поводу информации о текущем состоянии устройств и информации о текущем используемом медиаресурсе - да, это ценно, это буду пытаться прикрутить в обработку по событию запуску воспроизведения. Проверять, не используется ли тюнер другим устройством на другом канале. Надо ещё про интерфейс управления энигмой почитать, можно взять список каналов текущего транспондера, их можно смотреть не мешая просмотру других каналов с того же транспондера.</p>]]></description>
			<author><![CDATA[null@example.com (fctsu001)]]></author>
			<pubDate>Wed, 03 Oct 2018 07:16:18 +0000</pubDate>
			<guid>https://hms.lostcut.net/viewtopic.php?pid=13018#p13018</guid>
		</item>
		<item>
			<title><![CDATA[Re: Просмотр потока со спутникового ресивера через HMS]]></title>
			<link>https://hms.lostcut.net/viewtopic.php?pid=13006#p13006</link>
			<description><![CDATA[<div class="quotebox"><cite>fctsu001 пишет:</cite><blockquote><p>Теперь вопросы:<br />Можно ли в скрипте обработки, например, по событию, получить список текущих заданий транскодирования?<br />Как взять из этого списка параметр &quot;Исходный файл&quot; для каждого задания?<br />Можно ли принудительно завершить задание транскодирования?</p></blockquote></div><p>Нет, я такого не знаю. Можно получить список устройств, которая HMS знает. Как медиа-серверы в сети, так и медиа-рендереры (DMR).<br />Хотя...<br />Есть идея.<br />Можно получить список устройств, который HMS знает.<br />Например, получить список устройств воспроизведения. И по каждому устройству - получить его статус: проигрывает файл, пауза, неактивен.<br />То, что отображает окно, когда внизу программы на вкладке &quot;Устройства воспроизведения (DMR)&quot; щелкнуть два раза на устройстве - можно посмотреть даже позицию файла, если там запущен просмотр.</p><p>Вот пример скрипта, который может получить список устройств воспроизведения:<br /></p><div class="codebox"><pre><code>{
  // Получаем список устройств по указанному типу - MediaRenderer
  THmsScriptUPnPDeviceList DeviceList = THmsScriptUPnPDeviceList.Create(udtDeviceMediaRenderer);
  
  for (int i=0; i &lt; DeviceList.Count; i++) {
    THmsScriptUPnPDevice Device = DeviceList.Items[i];
    string urlDescr = Device.Properties[udpDescriptionURL];
    string img      = Device.Properties[udpDeviceIconURL ];
    string name     = Device.Properties[udpFriendlyName  ];
    string ip       = Device.Properties[udpIpAddress     ];
    string MAC      = Device.Properties[udpMacAddress    ];
    
    HmsLogMessage(1, &#039;DEVICE: Name=&#039;+name+&#039; MAC-адрес: &#039;+MAC+&#039; Страница описания: &#039;+urlDescr);
  }
  DeviceList.Free();
}</code></pre></div><p>Дело в том, что в примере выше в переменной urlDescr можно получить ссылку, которую можно открыть в браузере и посмотреть информацию об устройстве. А также о тех сервисах, которые устройство предоставляет для управления через сеть.</p><p>В общем так. Только что я попытался поэкспериментировать, вспомнил, что я уже пытался написать скрипт для управлением устройством (а это возможно).<br />Заодно решил попробовать использовать встроенные функции по управлению.</p><p>У объекта Device есть ServiceList, но с этим свойством вообще не получилось работать.</p><p>Получить сервис в скрипте получилось только через функцию<br />THmsScriptUPnPService Service = Device.FindService(udtServiceAvTransport);</p><p>Но вот использовать внутренние функции по выполнению команд InvokeUPnPAction, InvokeUPnPActionWithResultValues, InvokeUPnPActionWithResponseItem не получилось совсем.<br />Пришлось вспомнить свои знания по поводу стандарта DLNA и попытаться отправить запрос непосредственно устройству через сеть, с помощью правил SOAP.</p><p>В итоге я получил примерно такой код, который выводит информацию о всех устройствах воспроизведения и показывает текущий статус (играет, пауза или нет файла), а также, если есть, информацию о том, какой файл сейчас воспроизводится. Можно достать ещё всякую инфу.</p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header" data-lang-open="открыть спойлер" data-lang-close="скрыть спойлер"><strong>+</strong>&nbsp;открыть спойлер</div><div class="fancy_spoiler"><div class="codebox"><pre><code>{
  // Получаем список устройств по указанному типу - MediaRenderer
  THmsScriptUPnPDeviceList DeviceList = THmsScriptUPnPDeviceList.Create(udtDeviceMediaRenderer);
  string text=&#039;&#039;;
  for (int i=0; i &lt; DeviceList.Count; i++) {
    THmsScriptUPnPDevice Device = DeviceList.Items[i];
    string urlDescr = Device.Properties[udpDescriptionURL];
    string img      = Device.Properties[udpDeviceIconURL ];
    string name     = Device.Properties[udpFriendlyName  ];
    string ip       = Device.Properties[udpIpAddress     ];
    string MAC      = Device.Properties[udpMacAddress    ];

    // Получаем сервис AvTransport (управление устройством)
    THmsScriptUPnPService Service = Device.FindService(udtServiceAvTransport);
    
    string coltrol =  Service.ControlURL;
    string SCP     =  Service.SCPDURL;
    string type    =  Service.ServiceType;

    // Подготовка переменных
    int nPort=80; string sVal, state, headers, data, content, action, file, duration, itemID, path;
    if (HmsRegExMatch(&#039;:(\\d+)&#039;, Device.HttpServerAddr, sVal)) nPort = StrToInt(sVal);
    // Шаблон HTTP заголовков для стандарта SOAP (DLNA)
    headers = &#039;http://hms.org\r\nSOAPACTION: &quot;urn:schemas-upnp-org:service:AVTransport:1#{action}&quot;&#039;;
    
    // Получение текущего статуса устройства (NO_MEDIA_PRESENT|STOPPED|TRANSITIONING|PLAYING|PAUSED_PLAYBACK)
    action  = &#039;GetTransportInfo&#039;;
    content = Service.BuildActionContent(action, [&#039;InstanceID&#039;, &#039;0&#039;]);
    data = HmsSendRequest(ip, Service.ControlURL, &#039;POST&#039;, &#039;text/xml; charset=&quot;utf-8&quot;&#039;, ReplaceStr(headers, &#039;{action}&#039;, action), content, nPort);
    HmsRegExMatch(&#039;&lt;CurrentTransportState&gt;(.*?)&lt;/CurrentTransportState&gt;&#039;, data, state);
    
    // Получение информации о текущем медиа
    action  = &#039;GetMediaInfo&#039;;
    content = Service.BuildActionContent(action, [&#039;InstanceID&#039;, &#039;0&#039;]);
    data = HmsSendRequest(ip, Service.ControlURL, &#039;POST&#039;, &#039;text/xml; charset=&quot;utf-8&quot;&#039;, ReplaceStr(headers, &#039;{action}&#039;, action), content, nPort);
    data = HmsHtmlToText(HmsUtf8Decode(data));
    HmsRegExMatch(&#039;title&gt;(.*?)&lt;/&#039;    , data, file);
    HmsRegExMatch(&#039;duration=&quot;(.*?)&quot;&#039; , data, duration);
    HmsRegExMatch(&#039;&lt;item id=&quot;(.*?)&quot;&#039; , data, itemID);
    HmsRegExMatch(&#039;:video/.*?&gt;(.*?)&lt;&#039;, data, path);
    
    text += Format(&#039;Name: %s IP: %s\nState: %s\nFile: %s\nDuration: %s\nPath: %s\r\n\r\n&#039;, [name, ip, state, file, duration, path]);
  }
  ShowMessage(text); // Выводим сообщение
  DeviceList.Free();
}</code></pre></div></div></div>]]></description>
			<author><![CDATA[null@example.com (WendyH)]]></author>
			<pubDate>Tue, 02 Oct 2018 19:01:19 +0000</pubDate>
			<guid>https://hms.lostcut.net/viewtopic.php?pid=13006#p13006</guid>
		</item>
		<item>
			<title><![CDATA[Re: Просмотр потока со спутникового ресивера через HMS]]></title>
			<link>https://hms.lostcut.net/viewtopic.php?pid=12999#p12999</link>
			<description><![CDATA[<p>Позволю немного причесать код, чтобы он был немного более понятен:<br /></p><div class="codebox"><pre><code>#define DevAddress &#039;dm800&#039; // Имя устройства в сети или его IP-адрес.
{
  string serviceReference = &quot;&quot;;
  // Проверяем, это запустили на просмотр ссылку канала с тюнера?
  if (HmsRegExMatch(DevAddress+&#039;:8001/(.*)&#039;, CurrentMediaItem[mpiFilePath], serviceReference)) {
    string currentChannel = &quot;&quot;;
    string xmlSubservices = HmsDownloadURL(&#039;http://&#039;+DevAddress+&#039;/web/subservices&#039;);
    HmsRegExMatch(&#039;&lt;e2servicereference&gt;(.*?)&lt;/e2servicereference&gt;&#039;, xmlSubservices, currentChannel);
    // Проверяем и переключаем только если текущий канал не тот, что нужен
    if (serviceReference != currentChannel)
      HmsDownloadURL(&#039;http://&#039;+DevAddress+&#039;/web/zap?sRef=&#039;+serviceReference); // переключить тюнер на нужный канал
  }
}</code></pre></div><p>Теперь давайте сделаем универсальный dm800.hdf для возможности указать имя девайса.<br />Предлагаю брать его из поля &quot;Путь&quot; динамической папки.<br />Т.е. в скрипте это будет переменная mpFilePath.<br />Покажите, какой у вас сейчас код динамической папки, что именно хочется ещё реализовать и получается ли? Допилим.</p>]]></description>
			<author><![CDATA[null@example.com (WendyH)]]></author>
			<pubDate>Tue, 02 Oct 2018 16:04:58 +0000</pubDate>
			<guid>https://hms.lostcut.net/viewtopic.php?pid=12999#p12999</guid>
		</item>
		<item>
			<title><![CDATA[Re: Просмотр потока со спутникового ресивера через HMS]]></title>
			<link>https://hms.lostcut.net/viewtopic.php?pid=12994#p12994</link>
			<description><![CDATA[<p>Переделал обработку по событию &quot;после начала воспроизведения медиа-ресурса&quot;</p><div class="codebox"><pre><code>{
  string DevWebAddress = &#039;http://dm800&#039;;
  string servicereference = &#039;&#039;;
  // Проверяем, что это запустили на просмотр ссылку канала с тюнера.
  if (HmsRegExMatch(ReplaceStr(DevWebAddress,&#039;http://&#039;,&#039;&#039;)+&#039;:8001/(.*)&#039;, CurrentMediaItem[mpiFilePath], servicereference)) {
    // Если регулярка сработала, в servicereference у нас появится значение
    string CurrentService = &#039;&#039;;
    HmsRegExMatch(&#039;&lt;e2servicereference&gt;(.*)&lt;/e2servicereference&gt;&#039;, HmsDownloadURL(DevWebAddress + &#039;/web/subservices&#039;), CurrentService, 1, 0);
    if (servicereference == CurrentService) else {
       HmsLogMessage(3, &#039;Gotcha! : &#039;+CurrentMediaItem[mpiTitle]);
       HmsDownloadURL(DevWebAddress + &#039;/web/zap?sRef=&#039;+servicereference); // переключить тюнер на нужный канал
    }
  }
}</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (fctsu001)]]></author>
			<pubDate>Tue, 02 Oct 2018 00:46:43 +0000</pubDate>
			<guid>https://hms.lostcut.net/viewtopic.php?pid=12994#p12994</guid>
		</item>
		<item>
			<title><![CDATA[Re: Просмотр потока со спутникового ресивера через HMS]]></title>
			<link>https://hms.lostcut.net/viewtopic.php?pid=12948#p12948</link>
			<description><![CDATA[<div class="quotebox"><cite>WendyH пишет:</cite><blockquote><div class="codebox"><pre><code>THmsScriptMediaItem Item = HmsCreateMediaItem(&#039;http://dm800:8001/&#039;+sRef, FolderCat.ItemID);</code></pre></div></blockquote></div><p>Да, всё сработало, каналы создались, самое приятное - сохраняется порядок сортировки в категории на тюнере.</p><div class="quotebox"><cite>WendyH пишет:</cite><blockquote><p>Все доступные свойства у класса можно посмотреть в справочнике в редакторе (выдвигается панель справа).</p></blockquote></div><p>Что то я не понял, как, есть только списки переменных и функций, может я не туда смотрю?</p><div class="quotebox"><cite>WendyH пишет:</cite><blockquote><p>А при использовании дополнения <a href="https://hms.lostcut.net/viewtopic.php?id=131">HMSEditor Addon</a>, при наборе в редакторе переменной и нажав точку - вылезет подсказка с доступными методами и свойствами.</p></blockquote></div><p>Я до сих пор не поставил, наверное зря, дома озабочусь, на удалёнке не хочу ставить. Этого мне и не хватало, перебирал разные варианты, пробовал FolderCat.FolderId, при проверке редактор ругался на то, что не нашёл FolderId.</p><p>Теперь получился вполне рабочий вариант.</p><p>Теперь вопросы:<br />Можно ли в скрипте обработки, например, по событию, получить список текущих заданий транскодирования?<br />Как взять из этого списка параметр &quot;Исходный файл&quot; для каждого задания?<br />Можно ли принудительно завершить задание транскодирования?</p><p>Ну и - хочется допилить полученный вариант для общего пользования.<br />Вы сделали dm800.hdf для конкретного случая. А можно при импорте файла в HMS запросить адрес и имя ресурса?<br />Я вот думаю, как средствами HMS просканировать сеть на предмет наличия устройств под управлением для начала только Enigma2, ну и создать сразу каналы.</p><p>ЗЫ: и как засунуть в .hdf скрипт переключения каналов и повесить его на событие открытия ресурса?</p><p>ЗЗЫ:<br />Вот, что получилось. Переключение каналов на событии.<br /></p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header" data-lang-open="открыть спойлер" data-lang-close="скрыть спойлер"><strong>+</strong>&nbsp;открыть спойлер</div><div class="fancy_spoiler"><p>{<br />//&nbsp; string sScript = // Скрипт динамической папки конкретного канала<br />//&nbsp; &#039;{\r\n&#039;+<br />//&nbsp; &#039;&nbsp; // string sLink = &quot;http://dm800:8001/{ref}&quot;;\r\n&#039;+<br />//&nbsp; &#039;&nbsp; // string sLink = HmsDownloadURL(mpFilePath); // получаем ссылку на поток\r\n&#039;+<br />//&nbsp; &#039;&nbsp; // THmsScriptMediaItem Item = HmsCreateMediaItem(sLink, FolderItem.ItemID); // Создаём ссылку\r\n&#039;+<br />//&nbsp; &#039;&nbsp; THmsScriptMediaItem Item = HmsCreateMediaItem(&quot;http://dm800:8001/{ref}&quot;, FolderItem.ItemID); // Создаём ссылку\r\n&#039;+<br />//&nbsp; &#039;&nbsp; Item[mpiTitle] = mpTitle; // присваиваем название канала как у папки\r\n&#039;+<br />//&nbsp; &#039;&nbsp; Item[mpiTranscodingProfile] = &quot;Интернет-телевидение (Входной поток)&quot;; // Устанавливаем принудительно профиль транскодирования\r\n&#039;+<br />//&nbsp; &#039;&nbsp; HmsDownloadURL(&quot;http://dm800/web/zap?sRef={ref}&quot;); // переключаем на канал\r\n&#039;+<br />//&nbsp; &#039;}&#039;;<br />&nbsp; <br />&nbsp; FolderItem.DeleteChildItems();<br />&nbsp; <br />&nbsp; string DevWebAddress = &#039;http://dm800&#039;;<br />&nbsp; string xmlText = HmsDownloadURL(DevWebAddress+&#039;/web/getallservices&#039;); // Загружаем инфу о всех категориях и каналах<br />&nbsp; //string xmlText = HmsStringFromFile(&#039;D:\\allservices.xml&#039;); // local test</p><p>&nbsp; TXMLDocument XML = TXMLDocument.Create();<br />&nbsp; XML.LoadFromString(xmlText);<br />&nbsp; <br />&nbsp; for (int nCat=0; nCat &lt; XML.Root.Count; nCat++) {<br />&nbsp; &nbsp; TXMLItem CATEGORY = XML.Root[nCat];</p><p>&nbsp; &nbsp; TXMLItem ChLIST = CATEGORY.Find(&#039;e2servicelist&#039;);<br />&nbsp; &nbsp; if (ChLIST == nil) continue; // Если категория не содержит каналов, пропускаем</p><p>&nbsp; &nbsp; string sRefCategory = Trim(CATEGORY.ChildValues[&#039;e2servicereference&#039;]);<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; THmsScriptMediaItem FolderCat = FolderItem.AddFolder(DevWebAddress+&#039;/web/getservices?sRef=&#039;+HmsHttpEncode(sRefCategory), false, 32);<br />&nbsp; &nbsp; FolderCat[mpiTitle] = CATEGORY.ChildValues[&#039;e2servicename&#039;];<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; // Цикл создания списка каналов в папке категории<br />&nbsp; &nbsp; for (int nChan=0; nChan &lt; ChLIST.Count; nChan++) {<br />&nbsp; &nbsp; &nbsp; TXMLItem CHANNEL = ChLIST.Items[nChan];<br />&nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; if (Trim(CHANNEL.ChildValues[&#039;e2servicename&#039;]) == &#039;&lt;n/a&gt;&#039;) continue;<br />&nbsp; &nbsp; &nbsp; string sRef = Trim(CHANNEL.ChildValues[&#039;e2servicereference&#039;]);<br />&nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; //&nbsp; THmsScriptMediaItem Item = FolderCat.AddFolder(DevWebAddress+&#039;/web/stream.m3u?ref=&#039;+HmsHttpEncode(sRef), false, 32); // Добавляем что?<br />&nbsp; &nbsp; &nbsp; THmsScriptMediaItem Item = HMSCreateMediaItem(DevWebAddress+&#039;:8001/&#039;+sRef, FolderCat.ItemId); // Добавляем ссылку (канал)<br />&nbsp; &nbsp; //&nbsp; <br />&nbsp; &nbsp; &nbsp; Item[mpiTitle] = CHANNEL.ChildValues[&#039;e2servicename&#039;]; // Название канала<br />&nbsp; &nbsp; &nbsp; Item[mpiTranscodingProfile] = &quot;Интернет-телевидение (Входной поток)&quot;; // Устанавливаем принудительно профиль транскодирования<br />&nbsp; &nbsp; //&nbsp; Item[200] = 1;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // mpiFolderType 1 - &quot;динамическая (скрипт)&quot;<br />&nbsp; &nbsp; //&nbsp; Item[500] = ReplaceStr(sScript, &#039;{ref}&#039;, sRef); // mpiDynamicScript<br />&nbsp; &nbsp; //&nbsp; Item[501] = &#039;C++Script&#039;;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // mpiDynamicSyntaxType<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; <br />&nbsp; }<br />&nbsp; <br />&nbsp; XML.Free();<br />}</p></div></div><p>А к запуску конкретного канала ни как не прикрутить скрипт?</p>]]></description>
			<author><![CDATA[null@example.com (fctsu001)]]></author>
			<pubDate>Mon, 01 Oct 2018 09:22:58 +0000</pubDate>
			<guid>https://hms.lostcut.net/viewtopic.php?pid=12948#p12948</guid>
		</item>
		<item>
			<title><![CDATA[Re: Просмотр потока со спутникового ресивера через HMS]]></title>
			<link>https://hms.lostcut.net/viewtopic.php?pid=12947#p12947</link>
			<description><![CDATA[<div class="quotebox"><cite>fctsu001 пишет:</cite><blockquote><p>не понял, что и с какими параметрами вызвать, что бы создать вместо папки канал со ссылкой &#039;http://dm800:8001/&#039;+sRef.<br />Пробовал вызвать так:<br /></p><div class="codebox"><pre><code>THmsScriptMediaItem Item = HmsCreateMediaItem(&#039;http://dm800:8001/&#039;+sRef);</code></pre></div><p>, ничего не создаётся.</p></blockquote></div><p>Всё правильно, чтобы создать не папку, а ссылку, нужно вызывать HmsCreateMediaItem. Только во втором параметре указать ItemID той папки, в которой она будет создана.<br />Например:<br /></p><div class="codebox"><pre><code>THmsScriptMediaItem Item = HmsCreateMediaItem(&#039;http://dm800:8001/&#039;+sRef, FolderCat.ItemID);</code></pre></div><p>чтобы создать в папке категории. Или:<br /></p><div class="codebox"><pre><code>THmsScriptMediaItem Item = HmsCreateMediaItem(&#039;http://dm800:8001/&#039;+sRef, FolderItem.ItemID);</code></pre></div><p>чтобы создать в текущей папке, на момент срабатывания скрипта.<br /></p><div class="quotebox"><cite>fctsu001 пишет:</cite><blockquote><p>где найти информацию про объекты? У FolderCat есть свойство AddItem ? Но тут нужна помощь, объектно ориентированное программирование - тёмный лес для меня.</p></blockquote></div><p>Свойства зависят от того, какого класса объект. FolderCat - класс THmsScriptMediaItem.<br />Все доступные свойства у класса можно посмотреть в справочнике в редакторе (выдвигается панель справа).<br />А при использовании дополнения <a href="https://hms.lostcut.net/viewtopic.php?id=131">HMSEditor Addon</a>, при наборе в редакторе переменной и нажав точку - вылезет подсказка с доступными методами и свойствами.</p>]]></description>
			<author><![CDATA[null@example.com (WendyH)]]></author>
			<pubDate>Mon, 01 Oct 2018 08:44:59 +0000</pubDate>
			<guid>https://hms.lostcut.net/viewtopic.php?pid=12947#p12947</guid>
		</item>
		<item>
			<title><![CDATA[Re: Просмотр потока со спутникового ресивера через HMS]]></title>
			<link>https://hms.lostcut.net/viewtopic.php?pid=12939#p12939</link>
			<description><![CDATA[<p>Добавил в скорипт:<br /></p><div class="codebox"><pre><code>       if (Trim(CHANNEL.ChildValues[&#039;e2servicename&#039;]) == &#039;&lt;n/a&gt;&#039;) continue;</code></pre></div><p> перед </p><div class="codebox"><pre><code>      string sRef = Trim(CHANNEL.ChildValues[&#039;e2servicereference&#039;]);</code></pre></div><p> - убрал недоступные сервисы (остаются на ресивере при пересканировании спутника).</p><p>Вопросы:<br /></p><div class="codebox"><pre><code>THmsScriptMediaItem Item = FolderCat.AddFolder(&#039;http://dm800/web/stream.m3u?ref=&#039;+HmsHttpEncode(sRef), false, 32);</code></pre></div><p>Создаёт папку, не понял, что и с какими параметрами вызвать, что бы создать вместо папки канал со ссылкой &#039;http://dm800:8001/&#039;+sRef.<br />Пробовал вызвать так:<br /></p><div class="codebox"><pre><code>THmsScriptMediaItem Item = HmsCreateMediaItem(&#039;http://dm800:8001/&#039;+sRef);</code></pre></div><p>, ничего не создаётся.</p><p>ЗЫ: где найти информацию про объекты? У FolderCat есть свойство AddItem ? Но тут нужна помощь, объектно ориентированное программирование - тёмный лес для меня.</p>]]></description>
			<author><![CDATA[null@example.com (fctsu001)]]></author>
			<pubDate>Sun, 30 Sep 2018 20:02:05 +0000</pubDate>
			<guid>https://hms.lostcut.net/viewtopic.php?pid=12939#p12939</guid>
		</item>
		<item>
			<title><![CDATA[Re: Просмотр потока со спутникового ресивера через HMS]]></title>
			<link>https://hms.lostcut.net/viewtopic.php?pid=12913#p12913</link>
			<description><![CDATA[<div class="quotebox"><cite>WendyH пишет:</cite><blockquote><p>Насколько я знаю, VLC прекрасно переваривает полученные m3u8 плейлисты.</p></blockquote></div><p>Не факт, что HMS передаёт весь m3u, при запуске в информации о транскодировании в пути только первая строка (адреса нет).</p><p>Но сейчас нормально работает со строчкой установки профиля транскодирования и ручным формированием адреса.<br />В принципе рабочее решение.<br />Попробовал создать вместо папок каналы, что то не так делаю, не создаётся ничего. В принципе, переключение на каналы не сильно нужно, костыль через события работает надёжно.</p><p>Кстати, если транскодирование предыдущего канала не завершилось, поток с тюнера идёт, то он не даст переключить канал, у потока приоритет. Неплохо было бы научиться проверять этот факт и ждать или принудительно рвать поток.</p><p>Поскольку на соньке нужен другой профиль, через настройку устройств установил для неё в раздел интернет телевидения профиль ...VLC-FFMPEG, но используется профиль канала. Если очистить профиль канала, почему то берётся профиль Интернет телевидение (ремуксирование), если задать профиль с устройства, то он работает, но для динамических ресурсов это не сильно удобно.</p>]]></description>
			<author><![CDATA[null@example.com (fctsu001)]]></author>
			<pubDate>Sat, 29 Sep 2018 22:53:20 +0000</pubDate>
			<guid>https://hms.lostcut.net/viewtopic.php?pid=12913#p12913</guid>
		</item>
		<item>
			<title><![CDATA[Re: Просмотр потока со спутникового ресивера через HMS]]></title>
			<link>https://hms.lostcut.net/viewtopic.php?pid=12912#p12912</link>
			<description><![CDATA[<p>Я поправил скрипт вот так:<br /></p><div class="codebox"><pre><code>  string sScript = // Скрипт динамической папки конкретного канала
  &#039;{\r\n&#039;+
  &#039;  string sLink = &quot;http://dm800:8001/{ref}&quot;;\r\n&#039;+
  &#039;  // string sLink = HmsDownloadURL(mpFilePath); // получаем ссылку на поток\r\n&#039;+
  &#039;  THmsScriptMediaItem Item = HmsCreateMediaItem(sLink, FolderItem.ItemID); // Создаём ссылку\r\n&#039;+
  &#039;  Item[mpiTitle] = mpTitle; // присваиваем название канала как у папки\r\n&#039;+
  &#039;  HmsDownloadURL(&quot;http://dm800/web/zap?sRef={ref}&quot;); // переключаем на канал\r\n&#039;+
  &#039;}&#039;;</code></pre></div><p>Можно и без sLink, обойтись, конечно. Сейчас попробую профиль транскодирования воткнуть.</p>]]></description>
			<author><![CDATA[null@example.com (fctsu001)]]></author>
			<pubDate>Sat, 29 Sep 2018 21:43:12 +0000</pubDate>
			<guid>https://hms.lostcut.net/viewtopic.php?pid=12912#p12912</guid>
		</item>
		<item>
			<title><![CDATA[Re: Просмотр потока со спутникового ресивера через HMS]]></title>
			<link>https://hms.lostcut.net/viewtopic.php?pid=12911#p12911</link>
			<description><![CDATA[<p>А может вообще, попробовать оставить ссылку такую?<br /></p><div class="codebox"><pre><code>THmsScriptMediaItem Item = HmsCreateMediaItem(mpFilePath, FolderItem.ItemID);
Item[mpiTranscodingProfile] = &quot;Интернет-телевидение (Входной поток)&quot;; // Устанавливаем принудительно профиль транскодирования</code></pre></div><p>Т.е. вообще без использования sLink и его получения по ссылке.<br />Насколько я знаю, VLC прекрасно переваривает полученные m3u8 плейлисты. Т.е. даже ссылки на плейлисты.</p><p>Ну или придётся вырезать из sLink нужный участок. Например, вот так:<br /></p><div class="codebox"><pre><code>HmsRegExMatch(&quot;^(http.*?)$&quot;, sLink, sLink, 1, PCRE_MULTILINE);</code></pre></div><p>Т.е. участок кода может выглядеть так:<br /></p><div class="codebox"><pre><code>  string sScript = // Скрипт динамической папки конкретного канала
  &#039;{\r\n&#039;+
  &#039;  string sLink = HmsDownloadURL(mpFilePath); // получаем ссылку на поток\r\n&#039;+
  &#039;  HmsRegExMatch(&quot;^(http.*?)$&quot;, sLink, sLink, 1, PCRE_MULTILINE);\r\n&#039;+
  &#039;  THmsScriptMediaItem Item = HmsCreateMediaItem(sLink, FolderItem.ItemID); // Создаём ссылку\r\n&#039;+
  &#039;  Item[mpiTitle] = mpTitle; // присваиваем название канала как у папки\r\n&#039;+
  &#039;  Item[mpiTranscodingProfile] = &quot;Интернет-телевидение (Входной поток)&quot;; // Устанавливаем принудительно профиль транскодирования\r\n&#039;+
  &#039;  HmsDownloadURL(&quot;http://dm800/web/zap?sRef={ref}&quot;); // переключаем на канал\r\n&#039;+
  &#039;}&#039;;</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (WendyH)]]></author>
			<pubDate>Sat, 29 Sep 2018 21:25:07 +0000</pubDate>
			<guid>https://hms.lostcut.net/viewtopic.php?pid=12911#p12911</guid>
		</item>
		<item>
			<title><![CDATA[Re: Просмотр потока со спутникового ресивера через HMS]]></title>
			<link>https://hms.lostcut.net/viewtopic.php?pid=12910#p12910</link>
			<description><![CDATA[<p>Загрузил из файла, всё сработало, но каналы создаются с таким путём:<br /></p><div class="codebox"><pre><code>#EXTM3U
#EXTVLCOPT--http-reconnect=true
http://dm800:8001/1:0:19:4E8A:14:70:1680000:0:0:0:</code></pre></div><p>Соответственно, не показывает.<br /></p><div class="codebox"><pre><code>THmsScriptMediaItem Item = HmsCreateMediaItem(sLink, FolderItem.ItemID);</code></pre></div><p>чем порезать sLink? Можно тупо срезать начало, можно поискать http://<br />Руками если поправить, то работает. Может поэтому и m3u не вставляется?<br />И профиль транскодирования надо выбрать при создании, с профилем по умолчанию не работает. Надо &quot;интернет телевидение (входной поток), но на соньке надо другой руками ставить.</p>]]></description>
			<author><![CDATA[null@example.com (fctsu001)]]></author>
			<pubDate>Sat, 29 Sep 2018 20:35:08 +0000</pubDate>
			<guid>https://hms.lostcut.net/viewtopic.php?pid=12910#p12910</guid>
		</item>
	</channel>
</rss>
