Skip to content

Instantly share code, notes, and snippets.

@WendyH
Created January 10, 2015 11:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save WendyH/649d4aea299ea53e9f7a to your computer and use it in GitHub Desktop.
Save WendyH/649d4aea299ea53e9f7a to your computer and use it in GitHub Desktop.
Скрипт для динамической папки настроек подкаста в HMS
///////////////////////////////////////////////////////////////////////////////
// Г Л О Б А Л Ь Н Ы Е П Е Р Е М Е Н Н Ы Е //
THmsScriptMediaItem goRoot = FolderItem; // Корневая папка настроек
string gsRootPath = '-SettingsFolder', // Значение поля путь (ссылка) корневой папки настроек
gsKey = '', // Ключ (определяется ниже)
gsValue = ''; // Значение ключа (устанавливается ниже)
TDateTime gTimeStart = Now; // Время запуска скрипта
TStrings SETTINGS; // Объект TStrings для хранения описания настроек
int
gnTotalItems = 0, // Глобальный счетчик
// Константы параметров этой динамической папки
mpiFolderType = 200, // Тип папки
mpiDynamicScript = 500, // Скрипт
mpiDynamicSyntaxType = 501, // Язык скрипта
mpiPreviousItemID = 200104, // Предыдущий ItemID
;
///////////////////////////////////////////////////////////////////////////////
// Ф У Н К Ц И И //
// ----------------------------------------------------- Структура настроек ---
void SettingsStructure() {
// Указываем ключи и их наименования
// Также указываем ключ и далее знак ':' и после - значение ключа (или '+' - добавить, '-' - удалить ключ)
SETTINGS.Values["--chname"] = "Формат наименования канала";
SETTINGS.Values["--chname:-" ] = 'ИМЯ [ЗРИТЕЛЕЙ] СТАТУС';
SETTINGS.Values["--chname:[И][С][З]"] = 'ИМЯ: СТАТУС [ЗРИТЕЛЕЙ]';
SETTINGS.Values["--chname:[C][И][З]"] = 'СТАТУС - ИМЯ [ЗРИТЕЛЕЙ]';
SETTINGS.Values["--chname:[З][И][C]"] = '[ЗРИТЕЛЕЙ] ИМЯ: СТАТУС';
SETTINGS.Values["--chname:[И][Г][C]"] = 'ИМЯ. ИГРА: СТАТУС [ЗРИТЕЛЕЙ]';
SETTINGS.Values["--chname:[И][C][Г]"] = 'ИМЯ: СТАТУС - ИГРА [ЗРИТЕЛЕЙ]';
SETTINGS.Values["--quality"] = "Качество видео";
SETTINGS.Values["--quality:-" ] = 'Автовыбор';
SETTINGS.Values["--quality:source"] = 'Источник';
SETTINGS.Values["--quality:high" ] = 'Высокое';
SETTINGS.Values["--quality:medium"] = 'Среднее';
SETTINGS.Values["--quality:low" ] = 'Низкое';
SETTINGS.Values["--quality:mobile"] = 'Для мобильных';
SETTINGS.Values["--chkupdates"] = "Проверять обновления подкаста";
SETTINGS.Values["--chkupdates:-"] = 'Не проверять';
SETTINGS.Values["--chkupdates:+"] = 'Проверять';
}
// ---------------------------------- Проверка текущего состояния настройки ---
bool CheckKeyState(string sVal) {
string PARAMS = goRoot.ItemParent[mpiPodcastParameters]+' '; // Строка установленных параметров подкаста
bool bExist = (Pos(gsKey+' ', PARAMS)>0); // Проверяем, указан ли уже ключ
if (sVal=='-') return !bExist; // Если проверяемое значение '-' - ключ не должен быть указан
else if (sVal=='+') return bExist; // Если проверяемое значение '+' - указан ли ключ
else return (Pos(gsKey+'='+sVal+' ', PARAMS)>0); // Иначе проверяем, установлено ли в параметрах заданное значение
}
// ---------------------------------------------- Создание ссылки-сообщения ---
void ShowMessageLink(string sMsg) {
THmsScriptMediaItem Item = HmsCreateMediaItem(sMsg, FolderItem.ItemID);
Item[mpiThumbnail] = 'http://wonky.lostcut.net/icons/ok.png';
}
// ---------- Функция создания динамической папки с унаследованным скриптом ---
void CreateItem(string sTitle, string sLink) {
THmsScriptMediaItem Folder = FolderItem.AddFolder(sLink, true);
Folder[mpiTitle ] = sTitle;
Folder[mpiCreateDate] = VarToStr(IncTime(gTimeStart,0,-gnTotalItems,0,0)); gnTotalItems++;
Folder.CopyProperties(FolderItem, [mpiFolderType, mpiDynamicScript, mpiDynamicSyntaxType, mpiFolderSortOrder]);
}
///////////////////////////////////////////////////////////////////////////////
// ----------------------------------------------- Создание списка настроек ---
void CreateMainMenu() {
for (int i=0; i<SETTINGS.Count; i++) { // Обходим в цикле все настройки
string sKey = SETTINGS.Names[i]; // Получаем ключ настроек
if (Pos(':', sKey)>0) continue; // Если там есть ':', то это вариант настройки - пропускаем
CreateItem(SETTINGS.Values[sKey], '-showValues='+sKey); // Создаём пункт настройки
}
}
// ------------------------------------ Создание списка вариантов настройки ---
void CreateValuesList() {
int i; string sVal, sKey, sName, sState; // При входе в процедуру в gsKey уже сам ключ
for (i=0; i<SETTINGS.Count; i++) { // Обходим в цикле все настройки
sKey = SETTINGS.Names[i]; // Получаем ключ настроек
sName = SETTINGS.Values[sKey]; // Наименование варианта настройки
if (!HmsRegExMatch('^'+gsKey+':(.*)', sKey, sVal)) continue; // Если не получили значение нашего ключа, пропускаем
if (CheckKeyState(sVal)) sState='[v]'; else sState='[ ]'; // Проверка: установлено ли данное значение, ставим пометку
CreateItem(sState+' '+sName, '-key='+gsKey+' -value='+sVal); // Создаём пункт варианта настройки
}
}
// ------------------------ Включение/Отключение настройки или его значения ---
void ApplyKeyValue() {
// При входе в процедуру уже в gsKey - ключ, в gsValue - его значение (может быть '+' или '-', это установить или удалить параметр)
bool bExist; string sOldVal=gsKey, sNewVal, PARAMS; // По-умолчанию в sOldVal сам ключ
PARAMS = goRoot.ItemParent[mpiPodcastParameters]+' '; // Строка установленных параметров подкаста
HmsRegExMatch('('+gsKey+'=.*?)\\s', PARAMS, sOldVal); // Вылавливаем в sOldVal установленное значение
bExist = (Pos(sOldVal, PARAMS)>0); // Устанавливаем флаг присутсвия ключа в параметрах
if (gsValue=='-') sNewVal = ''; // Замена на пустое значение = удалению
else if (gsValue=='+') sNewVal = gsKey; // Просто устанавливаем ключ
else sNewVal = gsKey+'='+gsValue; // Устанавливаем ключ с новым значением
if (bExist) PARAMS = ReplaceStr(PARAMS, sOldVal, sNewVal); // Если ключ уже присутствует - заменяем
else PARAMS += sNewVal; // Иначе просто добавляем
ShowMessageLink('ВЫБРАНО: '+Copy(mpTitle, 5, 99)); // Пропускаем '[ ] ' в mpTitle и сообщаем о выбранном варианте
goRoot.ItemParent[mpiPodcastParameters] = Trim(ReplaceStr(PARAMS, ' ', ' ')); // Сохраняем параметры подкаста
}
// ----------------------------------------------------------------------------
// Проверка значения ссылки текущей папки и извлечение группировок регулярного выражения в gsKey и gsValue
bool CheckPath(string sPattern) { return HmsRegExMatch2(sPattern, mpFilePath, gsKey, gsValue); }
// ----------------------------------------------------------------------------
void CreateAboutLink() {
TStrings INFO = TStringList.Create(); // Создаём объект TStrings для информации
//INFO.Values['Poster'] = '';
INFO.Values['Title' ] = 'О подкасте "Twitch.TV"';
INFO.Values['Info' ] = 'Вещание игрового видео и киберспортивных турниров';
INFO.Values['Descr' ] = 'Twitch.tv - это сервис для онлайн вещания видеоигр. А этот подкаст - для того, чтобы смотреть на тех, кто играет. '+
'Как копят ману и играют в Just Dance!'+
'|В подкасте есть навигация по командам, каналам и играм. При входе в папку игры - отображается список активных каналов.'+
'|Раздел "Подписки" работает только при установленных в подкасте логине и пароле c сайта Twitch.tv. Каналы в подписках показываются только активные, которые вещаются в данный момент.'+
'|Чтобы указать свои Логин и Пароль, на подкасте "Twitch.tv" правой клавишей мышки - "Изменить название/Настройки" - внизу вкладка "Подключение" - Авторизация пользователя поставить на "Включена". Задать свой логин и пароль. Всё. Никаких галочек больше не ставить.'+
'|Т.к. каналы часто уходят в offline, то если какой-то канал не показывает - обновите ветку подкаста, возможно он уже стал неактивным.'+
'||(L) WendyH';
THmsScriptMediaItem Item = HmsCreateMediaItem('InfoAbouto', goRoot.ItemParent.ItemID);
Item[mpiTitle ] = 'О подкасте';
Item[1001001 ] = INFO.Text;
Item[mpiThumbnail ] = 'http://wonky.lostcut.net/vids/info.jpg';
Item[mpiTimeLength] = '00:00:10.000';
INFO.Free();
}
///////////////////////////////////////////////////////////////////////////////
// Г Л А В Н А Я П Р О Ц Е Д У Р А //
// ----------------------------------------------------------------------------
{
// Поиск корневой динамической папки (ибо этот скрипт может выполнятся и в подпапках)
while ((goRoot[mpiFilePath]!=gsRootPath) && (goRoot.ItemParent!=nil)) goRoot = goRoot.ItemParent;
if (goRoot[mpiFilePath]!=gsRootPath) { ShowMessageLink('Не найдена папка настроек с путём '+gsRootPath); return; }
// Если это повторный вызов, смены папки не произошло - ничего не делаем
if ((FolderItem.ItemID==goRoot[mpiPreviousItemID]) && (FolderItem!=goRoot) && !DebugMode) return;
CreateAboutLink();
FolderItem.DeleteChildItems(); goRoot[mpiPreviousItemID] = FolderItem.ItemID;
SETTINGS = TStringList.Create();
try {
SettingsStructure();
if (CheckPath(gsRootPath)) CreateMainMenu(); // Если это корень - создаём список настроек
else if (CheckPath('-showValues=(.*)')) CreateValuesList(); // Зашли в настройку - показываем список вариантов значений
else if (CheckPath('-key=(.*?) -value=(.*)')) ApplyKeyValue(); // Зашли в вариант значения настройки - применяем этот вариант
} finally { SETTINGS.Free(); }
HmsIncSystemUpdateID(); // Говорим устройству об обновлении содержания
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment