А как насчет метода от противного?

Интернет-телевидение, интернет-радио, подкасты, IPTV
Post Reply
jeamdany
Posts: 4
Joined: Sat May 28, 2016 9:58 pm

А как насчет метода от противного?

Post by jeamdany »

Есть, сайт с пополняемым каталогом видео. Есть хозяин - слегка ПХПшный программер и есть желание выгружать динамический файл подкаста напрямую из базы сайта с прямым формированием файла ядром сайта, безо всякого парсинга.
Можно просто популярно разложить структуру XML для формирования файла, понятного HMS? Пока-что все мои попытки вывести из ядра читаемый список на основе подсмотренного в готовых HDR успехом не увенчались - HMS постоянно чего-то не видит или не понимает. Можно где-то увидеть доступный человеческому мозгу синтаксис? Мне не нужна обработка скриптов - я добровоьно отдаю данные.
WendyH
Posts: 393
Joined: Fri Apr 13, 2012 7:59 pm

Re: А как насчет метода от противного?

Post by WendyH »

jeamdany wrote:Можно просто популярно разложить структуру XML для формирования файла, понятного HMS? Пока-что все мои попытки вывести из ядра читаемый список на основе подсмотренного в готовых HDR успехом не увенчались - HMS постоянно чего-то не видит или не понимает. Можно где-то увидеть доступный человеческому мозгу синтаксис? Мне не нужна обработка скриптов - я добровоьно отдаю данные.
Структура XML файла подкаста (файл с расширением .hdf) довольна проста и по сути - сериализованный объект базы данных программы класса THmsScriptMediaItem (описан в справочнике редактора скриптов). Все свойства класса в XML как элементы (без атрибутов).

А на пальцах, примерно следующее.
Корневой элемент: HmsMediaItem. С него всё начинается. Это элемент базы данных.

У него есть свойства:
MediaType - тип медиа-ссылки. Значение перечисления {mtUnknown=0, mtAudio=1, mtImage=2, mtVideo=3, mtText=4, mtIsoDisk=5}
ClassID - Идентификатор класса элемента базы.
  • 51 - папка подкастов раздела "Видео"
  • 53 - подкаст раздела "Видео"
  • 32 - динамическая папка скриптов
  • 78 - папка подкастов раздела "Фото"
  • 54 - папка подкастов раздела "Музыка"
  • 3 - ссылка на музыкальный файл в разделе "Музыка"
  • 4 - ссылка на файл фотографии в разделе "Фото"
  • 5 - ссылка на видео файл в разделе "Видео"
  • ...
К сожалению, я всех их не знаю.
ItemID - GUID элемента (уникальный идентификатор)
ItemPath - Ссылка (путь)
ParentID - GUID родителя. Значение ItemID элемента, содержащего данный.
[+] Вот тут небольшие пояснения по свойству ParentID
Если с подчинёнными элементами всё понятно, что это поле будет содержать значение ItemID папки, в который они входят. То самый верхний, корневой элемент тоже должен указать, к какой системной папке он принадлежит. Идентификаторы системных папок в базе данных программы определены.

Идентификаторы папок медиа-ресурса:

Code: Select all

mfAudioAlbumsItemID        = "CB5F0F05-1530-4E89-8FBB-8221F51B3208" - Папка "Альбомы" в разделе "Музыка"
mfAudioAllMusicItemID      = "3A7A26E4-4A50-47DA-B192-AB40740A3AFE" - Папка "Вся музыка" в разделе "Музыка"
mfAudioArtistsItemID       = "415009C9-15C4-43A6-A1C0-F8D835BC562E" - Папка "Исполнители" в разделе "Музыка"
mfAudioAudioDVBFolderItemID= "A96C242D-1AF1-4659-BEC3-D1D2670992ED" - Папка "Цифровое телевидение (DVB)" в разделе "Музыка"
mfAudioFavoritesItemID     = "AF4BDFC9-27A6-4260-BEE8-C7522B99D43F" - Папка "Избранные" в разделе "Музыка"
mfAudioGenresItemID        = "BE22B4D4-0CCA-4E84-8C41-F5E9B729ED49" - Папка "Жанры" в разделе "Музыка"
mfAudioInternetRadioItemID = "F38A68A9-EF1A-4862-972C-1E254946A010" - Папка "Интернет радио" в разделе "Музыка"
mfAudioIsoImagesItemID     = "492D4EA2-D5BB-4A03-B8B7-8CA0627CB547" - Папка "Образы CD/SACD/DVD/DVD-A/BD (ISO)" в разделе "Музыка"
mfAudioItemsFolderID       = "0972345A-4255-4ECA-98A1-F326465BA727" - Корневая папка "Музыка" в разделе "Музыка"
mfAudioPlaylistsItemID     = "F8799AE6-8D34-4D9F-9EE1-D5DDC4E3E479" - Папка "Списки воспроизведения" в разделе "Музыка"
mfAudioPodcastsFolderItemID= "D07257A1-2B10-4D2B-9A4C-9C65C6F5B394" - Папка "Подкасты" в разделе "Музыка"
mfAudioRemovableMediaItemID= "18DDA617-0C7F-4388-9544-06BE5CB17C82" - Папка "Съемные носители" в разделе "Музыка"
mfAudioTranscodingItemsID  = "BFB7F952-2FFA-4B01-A67A-BE6FCF91E237" - Папка "Транскодирование" в разделе "Музыка"
mfAudioWatchFoldersItemID  = "1D45C463-2837-4FC7-ADD1-C21A1BD68C94" - Папка "Каталоги медиа-ресурсов" в разделе "Музыка"
mfImageAlbumsItemID        = "A86A97DE-6391-4F17-A248-556A744D3BC3" - Папка "Альбомы" в разделе "Фото"
mfImageAllPicturesItemID   = "7CB8AC81-5BA3-4B2B-8530-205207393D90" - Папка "Все фото" в разделе "Фото"
mfImageByDateItemID        = "7BF63B5A-15A3-4273-8B1F-7317B60C0099" - Папка "По дате" в разделе "Фото"
mfImageFavoritesItemID     = "E2F790FB-7752-44E7-99C5-D56F6EE94A0E" - Папка "Избранные" в разделе "Фото"
mfImageIsoImagesItemID     = "20545244-E039-4185-8505-877BD5050514" - Папка "Образы CD/SACD/DVD/DVD-A/BD (ISO)" в разделе "Фото"
mfImageItemsFolderID       = "8ED989F8-10E9-4B9A-8EAE-E8150BE7A302" - Корневая папка "Фото" в разделе "Фото"
mfImageRemovableMediaItemID= "D5BDC974-E715-472B-9529-F30BD812CC2B" - Папка "Съемные носители" в разделе "Фото"
mfImageTranscodingItemsID  = "51CD16BC-BCEA-41F5-89DC-DB299527C5D4" - Папка "Транскодирование" в разделе "Фото"
mfImageWatchFoldersItemID  = "4588975D-B5E2-46DA-A859-07313C715BB1" - Папка "Каталоги медиа-ресурсов" в разделе "Фото"
mfVideoActorsItemID        = "EA46E456-5895-4C27-9BDC-9221CA8011D1" - Папка "Альбомы" в разделе "Фильмы"
mfVideoAllMoviesItemID     = "95D6D9F3-C720-4721-9315-94E82554630C" - Папка "Все фильмы" в разделе "Фильмы"
mfVideoCollectionsItemID   = "64AC312B-A76A-46F3-980F-D0DA0EEE188D" - Папка "Коллекции" в разделе "Фильмы"
mfVideoDVBFolderItemID     = "475F1DFE-1851-48F5-99ED-B4EAB3DF8D79" - Папка "Цифровое телевидение (DVB)" в разделе "Фильмы"
mfVideoDirectorsItemID     = "D90D367E-E3ED-4897-8A68-34C31FDA1312" - Папка "Режиссеры" в разделе "Фильмы"
mfVideoFavoritesItemID     = "864F0C0A-A1D3-48AE-ABFE-51612200967A" - Папка "Избранные" в разделе "Фильмы"
mfVideoGenresItemID        = "2A725EFC-9D48-4159-96E6-24B0F4791E0F" - Папка "Жанры" в разделе "Фильмы"
mfVideoInternetTelevisionItemID = "085C4743-A4DC-43B3-AB29-957BB759C6DF" - Папка "Интернет телевидение" в разделе "Фильмы"
mfVideoIsoImagesItemID     = "A8D11DA7-0A19-40D5-BB83-2BBA7036F214" - Папка "Образы CD/SACD/DVD/DVD-A/BD (ISO)" в разделе "Фильмы"
mfVideoItemsFolderID       = "4B011F97-1151-45B1-A954-76BDFCAE746A" - Корневая папка "Фильмы" в разделе "Фильмы"
mfVideoPodcastsFolderItemID= "234DF17B-418C-4FDC-9DFE-CD0C586D2E76" - Папка "Подкасты" в разделе "Фильмы"
mfVideoProducersItemID     = "AFA69EA9-3AC3-4ABD-AE81-90EEDC8CB97A" - Папка "Продюсеры" в разделе "Фильмы"
mfVideoRemovableMediaItemID= "D321AB9B-3AE5-46A4-9D98-59F5D653218B" - Папка "Съемные носители" в разделе "Фильмы"
mfVideoTranscodingItemsID  = "9F95A59C-E171-4B31-B5E6-AEEF379AED9F" - Папка "Транскодирование" в разделе "Фильмы"
mfVideoWatchFoldersItemID  = "B7A1EE6A-CE07-4E09-B5ED-E51D22BBE743" - Папка "Каталоги медиа-ресурсов" в разделе "Фильмы"
Например, корневой элемент сохранённого подкаста для раздела видео будет содержать значение ParentID = 234DF17B-418C-4FDC-9DFE-CD0C586D2E76.
Properties - список свойств элемента. Где каждый элемент называется Property и имеет элементы ID и Value.
[+] Пояснения к свойству Properties
ID - от 0 до 1000 зарезервированы и используются как служебные данные для программы. C ID свыше 1000 - это любые пользовательские данные.
Например, ID=4 - это наименование медиа-ссылки, в значении с ID=530 может хранится скрипт чтения списка ресурсов.
Вот некоторые значение ID и их описание:
4 - Наименование
3 - Длительность (в виде 00:00:00.000)
8 - Год
9 - Жанр
41 - Комментарий
35 - Дата/время создания
215 - Сортировка (может быть указан ID по которому нужно сортировать, минус в начале говорит об обратной сортировке)
Более полный список возможных ID можно посмотреть в редакторе скриптов, в справочнике в разделе "Константы" - "Идентификаторы параметров медиа-ресурса". Все константы, начинающиеся на mpi...
ChildItems - список дочерних элементов. Элементы Item (вместо корневого названия HmsMediaItem) - по сути те же самые элементы, с точно такой-же структурой как здесь и описано. Только свойство MediaType могут не иметь.

Подозреваю, что почти со всем этим вы и так разобрались, изучая строение hdf файла.
Но тут есть некоторые нюансы. Есть особенности программы HMS. Из-за чего вполне можно нарваться на "невидимость" созданных элементов в программе.
Дело в том, что при сохранении подкаста из программы в файл, видимо, также и при загрузке его в программу - не всегда учитываются дочерние элементы медиа-ресурса.
У элемента с ClassID = 53 (подкаст, большой оранжевый полосатый значок в программе) хоть в программе и могут быть подчинённые элементы с папками и ссылками, то при сохранении или загрузке в программу они не читаются (не учитываются). Этот элемент - обновляемый и предназначен для динамического создания ссылок внутри себя. Т.е. создания ссылок при его обновлении.

Поэтому, если вы хотите создать файл .hdf с уже заложенными ссылками на файлы, то вам нужно создать папку подкастов (ClassID = 51). Вот в ней сохраняются и загружаются ссылки на видео файлы.
Т.е. Создать корневой элемент с ClassID=51, а в ней уже в ChildItems создавать дочерние элементы Item с ClassID=51 или ClassID=5 (папки или ссылки на файлы).

Как-то так.
Могу помочь в написании скрипта или функции на пэхэпе, или какими-то разъяснениями по программе или коду (насколько знаю).
[+] Пример
Папка "Фильмы мегасайта" содержит папку "Трейлеры", которая содержит две ссылки на видео.

Code: Select all

<?xml version="1.0" encoding="utf-8"?>
<HmsMediaItem>
  <MediaType>3</MediaType>                                  <!-- Тип медиа-ресурса mtVideo -->
  <ClassID>51</ClassID>                                     <!-- ClassID=51 - папка подкастов раздела "Видео" -->
  <ItemID>47d2c3a8-44b7-4b36-af70-2d3eca300302</ItemID>     <!-- GUID (уникальный идентификатор элемента)     -->
  <ItemPath></ItemPath>                                     <!-- Путь, ссылка (не указана) -->
  <ParentID>234DF17B-418C-4FDC-9DFE-CD0C586D2E76</ParentID> <!-- GUID родительской папки   -->
  <Properties>                        <!-- Список свойств      -->
    <Property>                        <!-- элемент свойства    -->
      <ID>4</ID>                      <!-- ID=4 - наименование -->
      <Value>Фильмы мегасайта</Value> <!-- значение свойства   -->
    </Property>
  </Properties>
  <ChildItems>   <!-- список дочерних элементов -->
    <Item>
      <ClassID>51</ClassID>                                     <!-- Класс 51 - папка подкастов раздела "Видео" -->
      <ItemID>58d2c3a8-81b8-2e32-dd31-fd3eca50a113</ItemID>     <!-- GUID -->
      <ItemPath>Трейлеры</ItemPath>                             <!-- Путь, ссылка (у папки она не важна) -->
      <ParentID>47d2c3a8-44b7-4b36-af70-2d3eca300302</ParentID> <!-- GUID родительской папки -->
      <Properties>                    <!-- Список свойств      -->
        <Property>                    <!-- элемент свойства    -->
          <ID>4</ID>                  <!-- ID=4 - наименование -->
          <Value>Трейлеры</Value>     <!-- значение свойства   -->
        </Property>
        <Property>                    <!-- элемент свойства    -->
          <ID>3</ID>                  <!-- ID=3 - длительность -->
          <Value>00:02:20.000</Value> <!-- значение свойства   -->
        </Property>
      </Properties>
      <ChildItems>                    <!-- Список дочерних элементов -->
        <Item>
          <ClassID>5</ClassID>                                                                 <!-- ClassID=5 - ссылка на файл раздела "Видео"   -->
          <ItemID>1c294d78-e1b4-4563-a0c2-5e3ee91684cc</ItemID>                                <!-- GUID (уникальный идентификатор элемента)     -->
          <ItemPath>http://www.hdclub.ua/files/avpedia_test/tron_legacy_trailer.mp4</ItemPath> <!-- Путь, ссылка на файл                         -->
          <ParentID>58d2c3a8-81b8-2e32-dd31-fd3eca50a113</ParentID>                            <!-- GUID родительской папки                      -->
          <Properties>                <!-- Список свойств      -->
            <Property>                <!-- элемент свойства    -->
              <ID>4</ID>              <!-- ID=4 - наименование -->
              <Value>Tron Legacy (Трон) - 1080p Theatrical Trailer</Value>
            </Property>
            <Property>                <!-- элемент свойства    -->
              <ID>3</ID>              <!-- ID=3 - длительность -->
              <Value>00:02:20.000</Value>
            </Property>
          </Properties>
        </Item>
        <Item>
          <ClassID>5</ClassID>                                                                 <!-- ClassID=5 - ссылка на файл раздела "Видео"   -->
          <ItemID>2c294d78-e1b4-4563-a0c2-5e3ee91684cd</ItemID>                                <!-- GUID (уникальный идентификатор элемента)     -->
          <ItemPath>http://www.hdclub.ua/files/avpedia_test/inception_trailer.mp4</ItemPath>   <!-- Путь, ссылка на файл                         -->
          <ParentID>58d2c3a8-81b8-2e32-dd31-fd3eca50a113</ParentID>                            <!-- GUID родительской папки                      -->
          <Properties>                <!-- Список свойств      -->
            <Property>                <!-- элемент свойства    -->
              <ID>4</ID>              <!-- ID=4 - наименование -->
              <Value>Inception (Начало) - 1080p Theatrical Trailer</Value>
            </Property>
            <Property>                <!-- элемент свойства    -->
              <ID>3</ID>              <!-- ID=3 - длительность -->
              <Value>00:02:23.000</Value>
            </Property>
          </Properties>
        </Item>
      </ChildItems>
    </Item>
  </ChildItems>
</HmsMediaItem>
Мне вот интересно, такой файл будет содержать тысячи ссылок на видео с разделами по категориям и прочим?
Может проще сделать API, чтобы внешние программы или скрипты могли не сильно нагружая сервер делать запросы и получать нужную сжатую информацию, например в виде JSON?
SONY KDL-32CX520
jeamdany
Posts: 4
Joined: Sat May 28, 2016 9:58 pm

Re: А как насчет метода от противного?

Post by jeamdany »

WendyH wrote: Могу помочь в написании скрипта или функции на пэхэпе, или какими-то разъяснениями по программе или коду (насколько знаю).

Мне вот интересно, такой файл будет содержать тысячи ссылок на видео с разделами по категориям и прочим?
Может проще сделать API, чтобы внешние программы или скрипты могли не сильно нагружая сервер делать запросы и получать нужную сжатую информацию, например в виде JSON?
А вот по поводу API и json гораздо интереснее, этому можно найти потом множество применений. Достаточно задокументировать структуру выдачи данных по критериям запроса. Писать скрипт для ПХП неразумно, учитывая что я не пользуюсь никакими движками и пишу все сайты под себя, то каждый раз разным мастерам удобоваримые скрипты не напишешься, а вот создать простой массив в переменной и вывести его в Json сможет любой ПХПисец.

Можно ли развить эту тему?
WendyH
Posts: 393
Joined: Fri Apr 13, 2012 7:59 pm

Re: А как насчет метода от противного?

Post by WendyH »

jeamdany wrote:Можно ли развить эту тему?
Ещё как можно.
Правда я не знаю структуру вашей базы данных, какие поля вообще есть. Но в базовом виде можно было бы предложить следующее.

Для начала, нужно определится со структурой отдаваемых данных клиенту.
[+] Например, в объекте информации о видео может быть следующая информация

Code: Select all

video: {
  ID: <Num>,
  Name: "...",
  Name_eng: "...",
  Img: "...", // Ссылка на постер
  Type: "...", // "video", "sereis", "episode"
  Genre: "...",
  Duration: "...",
  Year: "...",
  Category: "...",
  Country: "...", // Страна
  Info: "...", // краткое описание фильма
  Quality: "...", // Информация о качестве
  Translation: "...", // Озвучка или перевод
  Urls: [ // Не обязательно так. Если файл с видео всегда одним качеством, то просто Url: "...",
    1080: "...", 
    720: "...", 
    480: "..."
  ],
  IMDb_id: <Num>
  Raiting_IMDb: "...",
  KP_id: <Num>
  Raiting_KP: "...",
  
  Series: [ // Если это сериал или многосерийный фильм, то тут список сезонов и серий. Иначе null.
    { 
       SeasonNo: <Num>, // Номер сезона
       Name: "", // Наименование сезона (наверно необязательно, ибо это всегда будет "1 сезон", "2 сезон"...)
       Episodes: [
         {
            EpisodeNo: <Num>, // Номер серии, если это серия сериала
            EpisodeTitle: "...",
            Url: "..."
         }
        ...
     },
     {...},
     ...
  ]
}
Методы:

GET https://site.com/api/categories // Получение списка категорий (ID и имя)
GET https://site.com/api/genres // Получение списка жанров (ID и имя)

GET https://site.com/api/videos.php // получения списка видео
Можно указывать параметры:
id=<ID> // Получение информации о конкретном видео по его ID
category=<ID> // Фильтрация видео по конкретной категории
year=<Num> // Фильтрация видео по году
genre=<ID> // Фильтрация видео по жанру

Пример:
https://site.com/api/videos.php?category=2 // Получение списка видео категории с ID=2
[+] Ответ

Code: Select all

[
  {
    ID: 122,
    Name: "Однажды в Америке",
    Name_eng: "Once Upon a Time in America",
    Type: "video",
    Genre: "Драма, Криминал",
    Duration: "03:49:00",
    Year: "1983",
    Category: "Фильмы",
    Info: "В бурные двадцатые годы...",
    Quality: "1080",
    Translation: "Дублированный",
    Url: "http://site.com/23/once_upon_time_in_america.avi", 
    Series: null
  },
  {
  ...
  }
]
SONY KDL-32CX520
jeamdany
Posts: 4
Joined: Sat May 28, 2016 9:58 pm

Re: А как насчет метода от противного?

Post by jeamdany »

Прекрасно! Структура запросов и вывода массива ясна, поля массива совпадают с полями базы и, уверен, что как и у большинства подобных сайтов.
Теперь чем бы этот ответ запросить из сервера и втянуть в него?
Я так понимаю, что наиболее удачным вариантом был бы файл скрипта подкастов, в котором в начальной переменной нужно указать путь к апи-запросам "http://site.com/api/" и раздавать этот файл всем желающим, которые, набросив его на сервер, сразу же получат список подкастов этого сайта.
WendyH
Posts: 393
Joined: Fri Apr 13, 2012 7:59 pm

Re: А как насчет метода от противного?

Post by WendyH »

jeamdany wrote:Я так понимаю, что наиболее удачным вариантом был бы файл скрипта подкастов, в котором в начальной переменной нужно указать путь к апи-запросам "http://site.com/api/" и раздавать этот файл всем желающим, которые, набросив его на [Домашний медиа-]сервер, сразу же получат список подкастов этого сайта.
В вашей цитате я вставил в квадратных скобках то, как я понял вас.
Если правильно понял, то - да.
Именно так. Потом на самом сайте можете выложить файл описания подкаста (.hdf) для Домашнего медиа-сервера, который можно будет закинуть в программу и при обновлении разделов получать свежие списки выложенных фильмов.
SONY KDL-32CX520
jeamdany
Posts: 4
Joined: Sat May 28, 2016 9:58 pm

Re: А как насчет метода от противного?

Post by jeamdany »

Все верно, вы правы, такой API скрипт и нужен.
WendyH
Posts: 393
Joined: Fri Apr 13, 2012 7:59 pm

Re: А как насчет метода от противного?

Post by WendyH »

Как сделаете работающий прототип API на сайте, скажите и я вам помогу сделать скрипт обновления подкастов (там всё не сложно).
SONY KDL-32CX520
Post Reply