Created
January 10, 2015 11:17
-
-
Save WendyH/649d4aea299ea53e9f7a to your computer and use it in GitHub Desktop.
Скрипт для динамической папки настроек подкаста в HMS
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/////////////////////////////////////////////////////////////////////////////// | |
// Г Л О Б А Л Ь Н Ы Е П Е Р Е М Е Н Н Ы Е // | |
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