Тема: Туториал: Написание подкастов
HMSEditor_addon - редактор скриптов с подсказками и более удобной отладкой.
Создание подкастов
Как выглядит то, о чём будет идти речь:
Совет: если вам что-то непонятно, то попробуйте оставить понимание этого на потом. Возможно, прочитав далее, в другом разделе или в дальнейших примерах, встретите ответ на свой вопрос.
В программе "Домашний медиа-сервер" есть папка "Подкасты", куда можно добавить элемент "Подкаст" или папку, содержащую сколько угодно таких элементов (папок и подкастов). Элемент "Подкаст" отличается от простой папки тем, что его можно обновить, нажав на нём в программе на компьютере правой клавишей мышки или зайдя при навигации на устройстве в папку "Обновить подкаст". В общем случае, назначение такого подкаста - создание внутри своей папки списка элементов, например ссылок на видео , музыкальные композиции или фотографии (смотря для какого раздела вы пишете подкаст: Фильмы, Музыка или Фото).
В программе Домашний медиа-сервер подкаст может создавать список элементов двумя способами:
- Автоматически из RSS фида
- В специально написанном скрипте
Создание списка видео из RSS-ленты
В случае создания списка из RSS фида, там всё достаточно просто. В поле "Ссылка" подкаста нужно указать ссылку на RSS feed. При обновлении такого подкаста будут созданы все элементы такой ленты. В простейшем случае, если в элементах фида прямые ссылки на видео, то этим всё и заканчивается. Подкаст готов.
Например, на сайте с видео выступлений дизайно-девелоперов MIX11 можно найти ссылки на RSS ленты и в поле "Ссылка" подкаста вставить что-то вроде https://s.ch9.ms/Events/MIX/MIX11/RSS/mp4
. Убедиться, что "Режим чтения списка ресурсов" выставлен в Стандартный (RSS), все скрипты выключены - то при обновлении подкаста увидим список видео, которые можем включить на просмотр.
Создание подкаста с использованием скриптов
В реальной жизни всё немного сложнее. Потому как даже в новостных лентах очень редко есть прямые ссылки на видео файлы или медиа ресурсы (как в примере выше). Обычно ссылка ведёт на страницу новости или сайта, где расположено видео. Так что приходиться включать использование скриптов и перед отдачей реальной ссылки на медиа-ресурс телевизору или другому устройству воспроизведения (медиаплееру), нужно обычно загружать страницу по ссылке, указанной в элементе подкаста, и оттуда каким-то образом получать реальную ссылку на медиа файл или поток (если это вещание).
Поэтому ниже будет рассказано о скриптах и их использовании.
Для использования скриптов в подкасте нужно их включить. Для этого нужно зайти в свойства подкаста, т.е. на самом подкасте нажать правой клавишей мышки и выбрать "Изменить название" или на папке, содержащую подкасты (наследующие эти скрипты), и выбрать "Изменить название/Настройки". В появившемся окне внизу нужно выбрать вкладку "Скрипты", установить "Режим чтения списка ресурсов" в значение Специальный (скрипт) и включить те скрипты, которые хотим использовать.
Рис.1 Окно свойств подкаста
Выше, на картинке (Рис.1) изображено окно, где включено использование скриптов. Вот некоторые пояснения к тому, что мы там можем увидеть.
"Режим чтения списка ресурсов" - режим, в котором будет работать подкаст:
Стандартный (RSS) - режим, для формирования списка ресурсов НЕ используется скрипт чтения списка ресурсов. Список ресурсов берётся из ленты RSS, ссылка которой указана в поле "Ссылка" подкаста.
Специальный (скрипт) - для формирования списка ресурсов (например, списка видео, музыкальных файлов или фото) будет использоваться скрипт "Скрипт чтения списка ресурсов (Alt + 2)". Где мы уже программно будем создавать элементы списка и будет создано только то, что мы сами укажем.
Наследовать - режим будет унаследован от папки, которая содержит данный подкаст.
"Скрипт создания подкаст-лент (Alt + 1)" - Есть только у папок и запускается на выполнение только интерактивно, через нажатие правой клавишей мышки на папке и выборе "Создать ленты подкастов" (пункт будет виден только у тех папок, у которых включён данный скрипт). Используется, в основном, для создания внутри этой папки списка самих подкастов.
"Скрипт чтения списка ресурсов (Alt + 2)" - Запускается на выполнение, когда вы обновляете подкаст через "Обновить подкаст". Используется для создания ссылок на видео (медиа-ресурсы).
"Скрипт чтения дополнительных свойств RSS (Alt + 3)" - может использоваться дополнительно к режиму чтения списка ресурсов "Стандартный (RSS)". В данной статье не рассматривается и как его использовать я пока не знаю.
"Скрипт получения ссылки на ресурс (Alt + 4)" - Запускается на выполнение, когда происходит запуск ссылки медиа-ресурса. Например, запуск фильма на просмотр (на телевизоре или медиаплеере запустили фильм) или музыкальной композиции. Используется для получения реальной ссылки на ресурс. Потому как часто ссылка медиа-ресурса ведёт на страницу фильма или видео, а в данном скрипте получают ссылку на сам видео файл и присваивают это значение переменной MediaResourceLink.
Указанные в скобках сочетания клавиш (Alt+2, Alt+4) - для быстрого доступа к скриптам (редактирование), при их наличии в подкасте. Обращаю внимание, что скрипт открывается тот, который используется, т.е. возможно унаследованный, если таковое стоит в настройках. Но для начального создания подкаста данные сочетания не сработают, потому как их (скрипты) нужно сначала ввести и сохранить.
Написание скриптов
Далее будет подразумеваться, что вы знакомы с каким-либо языком программирования (неважно, Pascal, C, JavaScript, хоть PHP или любым другим) и будут даны только отличия в синтаксисе и особенности использования в данной программе. Тут самого обучения программированию как такового нет, но будет объяснено как можно применить знания программирования для написания подкастов.
Для ввода скриптов в подкаст, в окне свойств подкаста нужно сначала включить их использование (Рис.1), а потом нажать на кнопку редактирования скрипта (стоит сразу за пунктом "Включен"). Откроется окно редактирования и отладки скрипта:
Рис.2 Окно редактирования скрипта
В открывшемся окне редактирования скрипта справа можно выдвинуть панель справочника функций, классов, переменных. Данная панель поможет увидеть какие есть в нашем распоряжении классы или функции, чем мы можем пользоваться в нашем скрипте. Под полем редактирования скрипта слева выбирается Язык синтаксиса, который мы будем использовать. Правее - кнопки, которые помогут нам проверить, запустить или отладить наш скрипт. Довольно удобно и круто, что в программе, в окне редактирования скрипта есть даже отладчик. Пусть простой, но с ним можно пошагово проверить выполнение и посмотреть текущие значения переменных.
К сожалению, забудьте про использование клавиши Tab. И если редактируете скрипт в другом редакторе где были табы в начале строк или копируете текст скрипта откуда-то где была табуляция, то после вставки такого текста в редактор, готовьтесь к неадекватному отображению текста и его редактированию. Сдвиг строки табуляцией может не происходить и удаление символа может происходить не там, где вы ожидаете - отображение каретки начинает врать относительно настоящей позиции.
Перед сохранением скрипта, обязательно запускайте проверку синтаксиса.
По поводу языка скриптов.
В программе Домашний медиа-сервер как движок для скриптов используется FastScript. У него есть масса ограничений и специфических свойств. Но для простых задач он вполне может подойти. Плохое и единственное описание находится тут. Если кому-то очень не хватает мощи настоящих языков программирования, жить не может без фреймворков, настоящего ООП или аллергия на Pascal - те идут обсуждать. А тем, кто считает, что если язык программирования умеет получать значение из ячейки и класть в неё, арифметические действия и битовый сдвиг, то с помощью этого языка можно сделать всё - значит добро пожаловать ниже.
Использование выбранного синтаксиса тут не значит, что можно использовать все возможности данного языка. Нельзя создавать классы, но можно создавать объекты из существующих встроенных классов и которые добавил сам автор программы (они перечислены справа в справочнике классов). Не все типы переменных возможно объявить, только те, которые заложены в FastScript (например, нет указателей - pointers). Нет операторов Include и проч. Как и программа, FastScript написана на Pascal (Delphi) и многие объекты и функции идут именно оттуда. Значение неустановленных объектов равно не NULL, а паскалевскому Nil. Есть и некоторые другие особенности. Их всех я даже не знаю.
Общие положения написания кода в программе Домашний медиа-сервер
В скрипте должна быть главная процедура, которая первая запускается в скрипте. Она может вызывать другие объявленные процедуры или функции, которые должны быть объявлены ранее неё. Это означает, что если у вас будет несколько процедур, то главная должна быть самой последней. Главная процедура в PascalScript объявляется так:
begin
end.
в C++Script и JScript объявляется так:
{
}
До использования FastScript в данной программе я практически не был знаком с языком Pascal, поэтому для себя выбрал более привычный язык синтаксиса C++Script и буду приводить примеры в основном на нём. Но если вам более близок другой синтаксис, то можете использовать PascalScript или JScript. Для начала, я буду дублировать некоторые примеры на PascalScript и C++Script. Подозреваю, что для знающих язык Delphi, разобраться будет гораздо легче. Но даже не знающих его - тоже не так уж трудно.
Кратко, чем они отличаются. Пример простенькой программы на PascalScript:
var
sMsg: String; // Объявляем переменную
begin
sMsg := 'Привет!'; // Присваиваем значение
ShowMessage(sMsg); // Выводим окно с нашим текстом
end.
Пример той-же программы на C++Script:
string sMsg; // Объявляем переменную
{
sMsg = 'Привет!'; // Присваиваем значение
ShowMessage(sMsg); // Выводим окно с нашим текстом
}
Пример той-же программы на JScript:
{
msg = 'Привет!'; // А, даже тип объявлять не обязательно...
ShowMessage(msg); // Выводим окно с нашим текстом
}
Примеры с объявлением дополнительных функций:
var
gsMsg: String; // Объявляем переменные
gnMyNum: Integer;
// Объявляем функцию для сложения двух чисел
function GetMyNumber(n1, n2: Integer): Integer; Begin
Result := n1 + n2;
end;
// ГЛАВНАЯ ПРОЦЕДУРА
begin
gnMyNum := GetMyNumber(1, 2); // Вызов нашей выше объявленной функции
gsMsg := 'Получилось число: ' + IntToStr(gnMyNum); // Формируем строку сообщения
ShowMessage(gsMsg); // Показываем сообщение
end.
Пример той-же программы на C++Script:
string gsMsg; // Объявляем переменные
int gnMyNum;
// Объявляем функцию для сложения двух чисел
int GetMyNumber(int n1, int n2) {
return n1 + n2;
}
// ГЛАВНАЯ ПРОЦЕДУРА
{
gnMyNum = GetMyNumber(1, 2); // Вызов нашей выше объявленной функции
gsMsg = 'Получилось число: ' + IntToStr(gnMyNum); // Формируем строку сообщения
ShowMessage(gsMsg); // Показываем сообщение
}
Как видите всё очень просто и всё отличается только некоторым оформлением: объявлением, присвоением :=
на просто =
, начало и конец блоков begin
и end
заменяются на {
и }
, некоторыми другими чисто синтаксическими вещами.
Отладка скриптов
Для отладки скрипта, его пошагового выполнения, можно поставить точку остановки (breakpoint), например, на строке gsMsg = 'Получилось число: ' + IntToStr(gnMyNum);
путём нажатия F5 или кликнув мышкой слева поля редактирования. Запустив скрипт на выполнение, программа остановиться на точке останова. Можно нажать Ctrl-F7, в появившемся окне вставить имя переменной и посмотреть её значение. Пошаговое выполнение команд - F8.
Рис.3 Пример отладки скрипта и просмотра значения переменной по Ctrl-F7
Также в окне вычисления выражения можно нажать на кнопку с картинкой , это добавит имя переменной (или выражения) в таблицу списка выражений справа. В этой таблице при отладке можно следить за текущими значениями переменных. Удалить строку из таблицы можно встав на неё и нажав Ctrl-Del.
Встроенные переменные
В программе Домашний медиа-сервер есть встроенные переменные, которые уже содержат соответствующие значения. Список доступных переменных также можно посмотреть справа в окне справочника. Некоторые переменные доступны только в определённых скриптах. Вот описание некоторых:
- Application - объект приложения TApplication, в контексте которого выполняется скрипт (предназначение мне не ясно);
- CurrentMediaItem - текущий элемент списка медиа-ресурсов при интерактивном запуске (из программы);
- DebugMode - содержит True, если скрипт запущен в отладчике;
- IsWine - содержит True, если программа Домашний медиа-сервер запущена в Linux под Wine;
- ServiceMode - содержит True, если скрипт выполняется в папке "Сервис"? (неизвестно, это предположение);
- InteractiveMode - содержит True, если скрипт выполняется в интерактивном режиме (запущен из программы на компьютере);
- FolderItem - текущий подкаст или папка, где исполняется скрипт (доступна только в скрипте чтения списка ресурсов или в скрипте создания подкаст-лент);
- PodcastItem - текущий медиа-ресурс, который запущен на воспроизведение (доступна только в скрипте получения ссылки на ресурс);
- MediaResourceLink - после завершения скрипта должна содержать реальную ссылку на видео, аудио или фото файл, как результат работы скрипта (доступна только в скрипте получения ссылки на ресурс);
gsUserVariable1 ... gsUserVariable5 - пользовательские глобальные переменные, которые сохраняют значение после завершения скрипта. Могут использоваться для передачи данных между разными скриптами.
Группа "Параметры медиа-ресурса" содержит список переменных, которые хранят значения параметров текущего медиа-ресурса и зависят от контекста исполнения. В скрипте чтения списка ресурсов это параметры подкаста, в скрипте получения ссылки на ресурс это параметры самого запускаемого медиа-ресурса. Вот несколько основных переменных:
- mpTitle - название;
- mpFilePath - значение поля "Ссылка" подкаста или медиа-ресурса;
- mpComment - комментарий;
- mpPodcastParameters - объединённое значение полей "Дополнительные параметры подкаста", начиная с текущего элемента и вверх - родительских папок. В основном, используется для проверки в скрипте дополнительно установленных ключей для подкаста;
- mpPodcastAuthorizationUserName - Унаследованное значение поля "Имя пользователя", если включена авторизация в подкасте или папке, содержащий данный подкаст;
- mpPodcastAuthorizationPassword - Унаследованное значение поля "Пароль", если включена авторизация в подкасте или папке, содержащий данный подкаст;
- Группа "Параметры настройки" это переменные, которые содержат текущие значения настроек программы или устройства. Например:
- cfgTranscodingScreenHeight - Высота кадра (которая казана в настройках устройства)
- cfgTranscodingScreenWidth - Ширина кадра (которая казана в настройках устройства)
- ...
Предназначение системных переменных ExceptionClassName и ExceptionMessage мне пока не известно (например, при возникновении исключения в них не было информации).
Если вы в скрипте меняете значение переменных параметров настройки или подкаста - это действует только в текущем исполняющемся скрипте. Например, если вы смените значение mpTitle, то это не поменяет название подкаста в базе программы, это просто сменит значение переменной.
Описание типов и классов тоже можно посмотреть в справочнике справа. Например видим, что переменная FolderItem имеет тип THmsScriptMediaItem. Включаем в справочнике отображение классов и находим там класс THmsScriptMediaItem. И там можем посмотреть какие функции и свойства есть у данного класса, а значит и у объекта, на который ссылается данная переменная. Для примера, есть свойство ChildCount - по названию понятно, что это количество дочерних элементов. А метод DeleteChildItems удаляет дочерние элементы (полезна для очистки, перед обновлением подкаста).
Пример работы со встроенными переменными
Давайте создадим новый подкаст, для примера, новых выступлений конференции TED и назовём его "www.ted.com", на котором мы потренируемся. В поле "Ссылка" введём https://www.ted.com/talks?language=ru
, режим чтения списка ресурсов включим в "Специальный (скрипт)", "Скрипт чтения списка ресурсов (Alt + 2)" в режим "Включен" и нажмём кнопку ОК, чтобы значения ссылки и наименования сохранились в программе.
Теперь откроем настройки подкаста через правую кнопку мыши и заново зайдём в редактирование скрипта чтения списка ресурсов .
Рис.4 Создание нашего первого подкаста
Потом заходим в скрипт чтения списка ресурсов и вставляем следующий код (язык C++Script):
{
ShowMessage(mpTitle+': '+mpFilePath);
}
При выполнении (запуск F9), можем увидеть следующее окно:
Рис.5 Результат выполнения примера работы с переменными
Где мы видим, что переменная mpTitle содержит строку "www.ted.com"
, т.е. заголовок текущего подкаста, а переменная mpFilePath содержит "https://www.ted.com/talks?language=ru"
- значение ссылки подкаста.
Если тут вам всё понятно, то тогда далее, я думаю, не должно возникнуть никаких трудностей. Мы рассмотрим самые нужные и распространённые функции, узнаем и научимся работать со встроенными классами, которые нам помогут сделать всё, что нужно для создания реального подкаста.