3
51
8719361c-395c-4f75-bdbb-9a08cde75ed6
https://filmix.site
234DF17B-418C-4FDC-9DFE-CD0C586D2E76
4
Filmix
515
1
700
0
701
-1
702
-1
517
578-720,722-1080,482-576,402-480,322-400,202-320,0-200
518
0
512
0
532
1
553
1
522
0
570
1
245
8719361c-395c-4f75-bdbb-9a08cde75ed6
93
42223,9883656713
571
// 2018.07.01 Collaboration: WendyH, Big Dog, михаил
/////////////////////// Создание структуры подкаста /////////////////////////
///////////////////////////////////////////////////////////////////////////////
// Г Л О Б А Л Ь Н Ы Е П Е Р Е М Е Н Н Ы Е //
THmsScriptMediaItem Podcast = GetRoot(); // Главная папка подкаста
string gsUrlBase = ''; // Url база ссылок нашего сайта (берётся из корневого элемента)
///////////////////////////////////////////////////////////////////////////////
// Ф У Н К Ц И И //
///////////////////////////////////////////////////////////////////////////////
// Установка переменной Podcast: поиск родительской папки, содержащий скрипт
THmsScriptMediaItem GetRoot() {
Podcast = FolderItem; // Начиная с текущего элемента, ищется создержащий срипт
while ((Trim(Podcast[550])=='') && (Podcast.ItemParent!=nil)) Podcast=Podcast.ItemParent;
return Podcast;
}
///////////////////////////////////////////////////////////////////////////////
// Создание подкаста
THmsScriptMediaItem CreatePodcast(THmsScriptMediaItem Folder, string sName, string sLink, String sParams='') {
THmsScriptMediaItem Item; // Объявляем переменные
//sLink = HmsExpandLink(sLink, gsUrlBase); // Делаем ссылку полной, если она таковой не является
Item = Folder.AddFolder(sLink); // Создаём подкаст с указанной ссылкой
Item[mpiTitle] = sName; // Присваиваем наименование
Item[mpiPodcastParameters] = sParams; // Дополнительные параметры подкаста
return Item;
}
///////////////////////////////////////////////////////////////////////////////
// Удаление всех существующих разделов(перед созданием) кроме поиска
void DeleteFolders() {
THmsScriptMediaItem Item, FavFolder; int i, nAnsw;
for (i=FolderItem.ChildCount-1; i>=0; i--) {
Item = FolderItem.ChildItems[i]; if (Item[mpiFilePath]=='-SearchFolder') continue;
Item.Delete();
}
}
///////////////////////////////////////////////////////////////////////////////
// Создание структуры
void CreateStructure() {
string sHtml, sData, sName, sLink; TRegExpr RegEx; // Объявляем переменные
THmsScriptMediaItem Folder, Item;
Folder = FolderItem.AddFolder('-SearchFolder', true); // Создаём папку
Folder[mpiTitle] = '0 Поиск';
CreatePodcast(FolderItem, '1 Последние поступления', '/'); // Создаём подкаст
CreatePodcast(FolderItem, '2 Новые фильмы' , '/films'); // Создаём подкаст
CreatePodcast(FolderItem, '3 Популярные фильмы' , '/popular/films'); // Создаём подкаст
CreatePodcast(FolderItem, '4 Мультфильмы' , '/multfilmy');
CreatePodcast(FolderItem, '5 Мультсериалы' , '/multserialy', '--pages=10');
CreatePodcast(FolderItem, '6 Сериалы' , '/serialy' , '--pages=20');
Folder = FolderItem.AddFolder('7 По категориям', true); // Создаём папку
sHtml = HmsUtf8Decode(HmsDownloadUrl(gsUrlBase)); // Загружаем страницу
sHtml = HmsRemoveLineBreaks(sHtml); // Удаляем переносы строк
// Вырезаем нужный блок в переменную sData
HmsRegExMatch('menu-title">Фильмы<.*?</ul>(.*?)class="lucky"', sHtml, sData);
// Создаём объект для поиска текста и ищем в цикле по регулярному выражению
RegEx = TRegExpr.Create('<a[^>]+href="(.*?)".*?</a>');
try {
if (RegEx.Search(sData)) do { // Если нашли совпадение, запускаем цикл
sLink = RegEx.Match(1); // Получаем значение первой группировки
sName = RegEx.Match(0); // Получаем совпадение всего шаблона
sName = HmsHtmlToText(sName); // Преобразуем html в простой текст
CreatePodcast(Folder, sName, sLink); // Создаём подкаст с полученным именем и ссылкой
} while (RegEx.SearchAgain); // Повторяем цикл, если найдено следующее совпадение
} finally { RegEx.Free(); } // Освобождаем объект из памяти
}
///////////////////////////////////////////////////////////////////////////////
// Г Л А В Н А Я П Р О Ц Е Д У Р А //
{
HmsRegExMatch('^(.*?//[^/]+)', Podcast[mpiFilePath], gsUrlBase); // Получаем значение в gsUrlBase
DeleteFolders(); // Удаляем созданное ранее содержимое
CreateStructure(); // Создаём подкасты
}
572
C++Script
530
// 2018.07.01 Collaboration: WendyH, Big Dog, михаил
//////////////////////// Создание списка видео ///////////////////////////
///////////////////////////////////////////////////////////////////////////////
// Г Л О Б А Л Ь Н Ы Е П Е Р Е М Е Н Н Ы Е //
THmsScriptMediaItem Podcast = GetRoot(); // Главная папка подкаста
string gsUrlBase = ''; // Url база ссылок нашего сайта (берётся из корневого элемента)
bool gbHttps = (LeftCopy(gsUrlBase, 5)=='https');
int gnTotalItems = 0; // Количество созданных элементов
TDateTime gStart = Now; // Время запуска скрипта
int gnMaxPages = 10; // Макс. кол-во страниц для загрузки списка видео
// Регулярные выражения для поиска на странице блоков с информацией о видео
string gsPatternBlock = '<article(.*?)</article>' ;
string gsPatternTitle = '(<div[^>]+name.*?</(h\\d|div)>)'; // Название
string gsPatternLink = '<a[^>]+href="([^"]+html)"' ; // Ссылка
string gsPatternYear = '-(\\d{4}).html' ; // Год
string gsPatternImg = '<img[^>]+src="(.*?)"' ; // Картинка
string gsPatternPages = '.*/page/\\d+/">(\\d+)' ; // Поиск максимального номера страницы
string gsPagesParam = '/page/<PN>/';
///////////////////////////////////////////////////////////////////////////////
// Ф У Н К Ц И И //
///////////////////////////////////////////////////////////////////////////////
// Установка переменной Podcast: поиск родительской папки, содержащий скрипт
THmsScriptMediaItem GetRoot() {
Podcast = FolderItem; // Начиная с текущего элемента, ищется создержащий срипт
while ((Trim(Podcast[550])=='') && (Podcast.ItemParent!=nil)) Podcast=Podcast.ItemParent;
return Podcast;
}
///////////////////////////////////////////////////////////////////////////////
// --- Создание папки видео ---------------------------------------------------
THmsScriptMediaItem CreateFolder(THmsScriptMediaItem Folder, string sName, string sLink, string sImg='') {
THmsScriptMediaItem Item = Folder.AddFolder(sLink); // Создаём папку с указанной ссылкой
Item[mpiTitle ] = sName; // Присваиваем наименование
Item[mpiThumbnail ] = sImg; // Картинка
Item[mpiCreateDate] = DateTimeToStr(IncTime(gStart, 0, 0, -gnTotalItems, 0));
gnTotalItems++; // Увеличиваем счетчик созданных элементов
return Item; // Возвращаем созданный объект
}
///////////////////////////////////////////////////////////////////////////////
// ------------------------------------ Получение название группы из имени ----
string GetGroupName(string sName) {
string sGrp = '#';
if (HmsRegExMatch('([A-ZА-Я0-9])', sName, sGrp, 1, PCRE_CASELESS)) sGrp = Uppercase(sGrp);
if (HmsRegExMatch('[0-9]', sGrp, sGrp)) sGrp = '#';
if (HmsRegExMatch('[A-Z]', sGrp, sGrp)) sGrp = 'A..Z';
return sGrp;
}
//////////////////////////////////////////////////////////////////////////////
// Создание ссылки-ошибки
void ErrorItem(string sMsg) {
THmsScriptMediaItem Item = HmsCreateMediaItem('InfoError'+IntToStr(gnTotalItems),FolderItem.ItemID);
Item[mpiTitle ] = sMsg;
Item[mpiThumbnail ] = 'http://wonky.lostcut.net/icons/symbol-error.png'; gnTotalItems++;
}
//////////////////////////////////////////////////////////////////////////////
// Авторизация на сайте
bool Login() {
string sUser, sPass, sLink, sData, sPost, sRet, sCookie, sHeaders, sDomen;
HmsRegExMatch('//([^/]+)', gsUrlBase, sDomen);
int nPort = 80; if (gbHttps) nPort = 443;
int nFlags = 0x10; // INTERNET_COOKIE_THIRD_PARTY;
sHeaders = gsUrlBase+"/\r\n"+
"Accept: */*\r\n"+
"Origin: "+gsUrlBase+"\r\n"+
"X-Requested-With: XMLHttpRequest\r\n"+
"User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36\r\n";
if ((Trim(mpPodcastAuthorizationUserName)=='') || (Trim(mpPodcastAuthorizationPassword)=='')) {
ErrorItem('Не указан логин или пароль');
return false;
}
sUser = HmsHttpEncode(HmsUtf8Encode(mpPodcastAuthorizationUserName)); // Логин
sPass = HmsHttpEncode(HmsUtf8Encode(mpPodcastAuthorizationPassword)); // Пароль
sUser = ReplaceStr(sUser, "@", "%2540");
sPost = 'login_name='+sUser+'&login_password='+sPass+"&login_not_save=0&login=submit";
sData = HmsSendRequestEx(sDomen, '/engine/ajax/user_auth.php', 'POST', 'application/x-www-form-urlencoded; charset=UTF-8', sHeaders, sPost, nPort, nFlags, sRet, true);
sData = HmsUtf8Decode(sData);
if (HmsRegExMatch('AUTHORIZED', sData, '')) return true;
ErrorItem('Введён неправильный логин или пароль');
return false;
}
///////////////////////////////////////////////////////////////////////////////
// --- Создание структуры -----------------------------------------------------
void CreateVideoFolders() {
string sHtml, sData, sName, sLink, sImg, sYear, sVal, sGroupingKey='none', sGrp, sDomen;
int i, nPages, nMaxInGroup, iCnt, nGrp; TRegExpr RegEx; bool bPost; // Объявляем переменные
THmsScriptMediaItem Folder = FolderItem; string sHeaders;
HmsRegExMatch('//([^/]+)', gsUrlBase, sDomen);
sHeaders = gsUrlBase+"\r\n"+
"Origin: "+gsUrlBase+"\r\n"+
"User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36\r\n"+
"X-Requested-With: XMLHttpRequest\r\n";
sHtml = ''; // Текст загруженных страниц сайта
nPages = gnMaxPages; // Количество загружаемых страниц
nMaxInGroup = 100;
int nPort = 80; if (gbHttps) nPort = 443;
HmsRegExMatch('--group=(\\w+)', mpPodcastParameters, sGroupingKey);
if (HmsRegExMatch('--pages=(\\d+)', mpPodcastParameters, sVal)) nPages = StrToInt(sVal);
if (HmsRegExMatch('--maxingroup=(\\d+)', mpPodcastParameters, sVal)) nMaxInGroup = StrToInt(sVal);
if (HmsRegExMatch('--maxpages=(\\d+)' , mpPodcastParameters, sVal)) gnMaxPages = StrToInt(sVal);
// Проверяем, не заняться ли нам поиском?
if (Pos("search_start=", mpFilePath)>0) {
HmsUtf8Decode(HmsDownloadUrl(gsUrlBase)); // для установки кук
gsPatternPages = '.*list_submit2\\((\\d+)';
gsPagesParam = '&search_start=<PN>';
bPost = true;
} else if ((LeftCopy(mpFilePath, 4)!='http')&&(LeftCopy(mpFilePath, 1)!='/')) {
HmsUtf8Decode(HmsDownloadUrl(gsUrlBase)); // для установки кук
// Если в поле "Ссылка" нет реальной ссылки, то делаем ссылку сами - будем искать наименование
mpFilePath = 'scf=fx&search_start=0&do=search&subaction=search&years_ot=1902&years_do=2018&kpi_ot=1&kpi_do=10&imdb_ot=1&imdb_do=10&sort_name=&undefined=asc&sort_date=&sort_favorite=&simple=1&story='+HmsHttpEncode(HmsUtf8Encode(mpTitle));
gsPatternPages = '.*list_submit2\\((\\d+)';
gsPagesParam = '&search_start=<PN>';
bPost = true;
} else if (Pos("/catalog/", mpFilePath)>0) {
gsPatternBlock = '(class="film".*?</div>)';
gsPatternTitle = '(<div[^>]+name.*?</div>)'; // Название
}
if (!bPost) mpFilePath = HmsExpandLink(mpFilePath, gsUrlBase);
if (bPost) sHtml = HmsUtf8Decode(HmsSendRequestEx(sDomen, "/engine/ajax/sphinx_search.php", "POST", "application/x-www-form-urlencoded; charset=UTF-8", sHeaders, mpFilePath, nPort, 0x10,sVal,true));
else sHtml = HmsUtf8Decode(HmsDownloadUrl(mpFilePath)); // Загружаем страницу
if ((Pos("user-profile", sHtml) < 1) && (Trim(mpPodcastAuthorizationUserName)!="") && !bPost) {
if (!Login()) return;
sHtml = HmsUtf8Decode(HmsDownloadUrl(mpFilePath));
}
// Дозагрузка страниц (если задан шаблон поиска максимального номера сраницы)
if ((gsPatternPages!='') && HmsRegExMatch(gsPatternPages, sHtml, sVal, 1, PCRE_SINGLELINE)) {
nPages = StrToInt(sVal); // Номер последней страницы
if (nPages > gnMaxPages) nPages = gnMaxPages;
}
for (i=2; i<nPages; i++) {
HmsSetProgress(Trunc(i*100/nPages)); // Устанавливаем позицию прогресса загрузки
HmsShowProgress(Format('%s: Страница %d из %d', [mpTitle, i, nPages])); // Показываем окно прогресса
sLink = mpFilePath + ReplaceStr(gsPagesParam, '<PN>', Str(i));
if (bPost) {
if (HmsRegExMatch('(&?search_start=\\d+)', mpFilePath, sVal)) mpFilePath = ReplaceStr(mpFilePath, sVal, "");
sHtml += HmsUtf8Decode(HmsSendRequestEx(sDomen, "/engine/ajax/sphinx_search.php", "POST", "application/x-www-form-urlencoded; charset=UTF-8",sHeaders,sLink,nPort,0x10,sVal,true));
} else {
sHtml += HmsUtf8Decode(HmsDownloadUrl(sLink)); // Загружаем страницу
}
if (HmsCancelPressed()) break; // Если в окне прогресса нажали "Отмена" - прерываем цикл
}
HmsHideProgress(); // Убираем окно прогресса с экрана
sHtml = HmsRemoveLineBreaks(sHtml); // Удаляем переносы строк, для облегчения работы с регулярными выражениями
// Создаём объект для поиска и ищем в цикле по регулярному выражению
RegEx = TRegExpr.Create(gsPatternBlock);
try {
if (sGroupingKey=='none') {
i=0; if (RegEx.Search(sHtml)) do i++; while (RegEx.SearchAgain);
if (i>nMaxInGroup) sGroupingKey = "quant";
}
if (RegEx.Search(sHtml)) do { // Если нашли совпадение, запускаем цикл
sLink=''; sName=''; sImg=''; sYear=''; // Очищаем переменные от предыдущих значений
HmsRegExMatch(gsPatternLink , RegEx.Match, sLink); // Ссылка
HmsRegExMatch(gsPatternTitle, RegEx.Match, sName); // Наименование
HmsRegExMatch(gsPatternImg , RegEx.Match, sImg ); // Картинка
HmsRegExMatch(gsPatternYear , RegEx.Match, sYear); // Год
if (sLink=='') continue; // Если нет ссылки, значит что-то не так
sLink = HmsExpandLink(sLink, gsUrlBase); // Делаем ссылку полной, если она таковой не является
if (sImg!='') sImg = HmsExpandLink(sImg, gsUrlBase); // Если есть ссылка на картинку, делаем ссылку полной
sName = HmsHtmlToText(sName); // Преобразуем html в простой текст
HmsRegExMatch('(.*?)/' , sName, sName); // Обрезаем слишком длинные названия (на англ. языке)
// Если в названии нет года, добавляем год выхода
if ((sYear!='') && (Pos(sYear, sName)<1)) sName += ' ('+sYear+')';
if (sGroupingKey=="quant") {
sGrp = Format("%.2d", [nGrp]);
iCnt++; if (iCnt>=nMaxInGroup) { nGrp++; iCnt=0; }
}
// else if (sGroupingKey=="alph") sGrp = GetGroupName(sName);
// else if (sGroupingKey=="year") sGrp = sYear;
else sGrp = "";
//if (Trim(sGrp)!="") Folder = CreateFolder(FolderItem, sGrp, sGrp);
CreateFolder(Folder, sName, sLink, sImg); // Вызываем функцию создания папки видео
} while (RegEx.SearchAgain); // Повторяем цикл, если найдено следующее совпадение
} finally { RegEx.Free; } // Освобождаем объект из памяти
if (sGroupingKey=="alph") FolderItem.Sort("mpTitle");
else if (sGroupingKey=="year") FolderItem.Sort("-mpTitle");
}
///////////////////////////////////////////////////////////////////////////////
// Проверка и обновление скриптов подкаста
void CheckPodcastUpdate() {
string sData, sName, sLang, sExt, sMsg; int i, mpiTimestamp=100602, mpiSHA, mpiScript;
TJsonObject JSON, JFILE; TJsonArray JARRAY; bool bChanges=false;
// Если после последней проверки прошло меньше получаса - валим
if ((Trim(Podcast[550])=='') || (DateTimeToTimeStamp1970(Now, false)-StrToIntDef(Podcast[mpiTimestamp], 0) < 14400)) return; // раз в 4 часа
Podcast[mpiTimestamp] = DateTimeToTimeStamp1970(Now, false); // Запоминаем время проверки
sData = HmsDownloadURL('https://api.github.com/repos/WendyH/HMS-podcasts/contents/Filmix.net', "Accept-Encoding: gzip, deflate", true);
JSON = TJsonObject.Create();
try {
JSON.LoadFromString(sData);
JARRAY = JSON.AsArray(); if (JARRAY==nil) return;
for (i=0; i<JARRAY.Length; i++) { // Обходим в цикле все файлы в папке github
JFILE = JARRAY[i]; if(JFILE.S['type']!='file') continue;
sName = ChangeFileExt(JFILE.S['name'], ''); sExt = ExtractFileExt(JFILE.S['name']);
switch (sExt) { case'.cpp':sLang='C++Script'; case'.pas':sLang='PascalScript'; case'.vb':sLang='BasicScript'; case'.js':sLang='JScript'; default:sLang=''; } // Определяем язык по расширению файла
if (sName=='CreatePodcastFeeds' ) { mpiSHA=100701; mpiScript=571; sMsg='Требуется запуск "Создать ленты подкастов"'; } // Это сприпт создания покаст-лент (Alt+1)
else if (sName=='CreateFolderItems' ) { mpiSHA=100702; mpiScript=530; sMsg='Требуется обновить раздел заново'; } // Это скрипт чтения списка ресурсов (Alt+2)
else if (sName=='PodcastItemProperties') { mpiSHA=100703; mpiScript=510; sMsg='Требуется обновить раздел заново'; } // Это скрипт чтения дополнительных в RSS (Alt+3)
else if (sName=='MediaResourceLink' ) { mpiSHA=100704; mpiScript=550; sMsg=''; } // Это скрипт получения ссылки на ресурс (Alt+4)
else continue; // Если файл не определён - пропускаем
if (Podcast[mpiSHA]!=JFILE.S['sha']) { // Проверяем, требуется ли обновлять скрипт?
sData = HmsDownloadURL(JFILE.S['download_url'], "Accept-Encoding: gzip, deflate", true); // Загружаем скрипт
if (sData=='') continue; // Если не получилось загрузить, пропускаем
Podcast[mpiScript+0] = HmsUtf8Decode(ReplaceStr(sData, '\xEF\xBB\xBF', '')); // Скрипт из unicode и убираем BOM
Podcast[mpiScript+1] = sLang; // Язык скрипта
Podcast[mpiSHA ] = JFILE.S['sha']; bChanges = true; // Запоминаем значение SHA скрипта
HmsLogMessage(1, Podcast[mpiTitle]+": Обновлён скрипт подкаста "+sName); // Сообщаем об обновлении в журнал
if (sMsg!='') FolderItem.AddFolder(' !'+sMsg+'!'); // Выводим сообщение как папку
}
}
} finally { JSON.Free; if (bChanges) HmsDatabaseAutoSave(true); }
} //Вызов в главной процедуре: if ((Pos('--nocheckupdates' , mpPodcastParameters)<1) && (mpComment=='--update')) CheckPodcastUpdate();
///////////////////////////////////////////////////////////////////////////////
// Г Л А В Н А Я П Р О Ц Е Д У Р А //
///////////////////////////////////////////////////////////////////////////////
{
HmsRegExMatch('^(.*?//[^/]+)', Podcast[mpiFilePath], gsUrlBase); // Получаем значение в gsUrlBase
gbHttps = (LeftCopy(gsUrlBase, 5)=='https'); // Флаг использования 443 порта для запросов
FolderItem.DeleteChildItems(); // Удаляем созданное ранее содержимое
if ((Pos('--nocheckupdates', mpPodcastParameters)<1) && (mpComment=='--update')) CheckPodcastUpdate(); // Проверка обновлений подкаста
CreateVideoFolders(); // Запускаем загрузку страниц и создание папок видео
HmsLogMessage(1, Podcast[mpiTitle]+' "'+mpTitle+'": Создано элементов - '+IntToStr(gnTotalItems));
}
531
C++Script
550
// 2018.12.16 Collaboration: WendyH, Big Dog, михаил, Spell
////////////////// Получение ссылок на медиа-ресурс ////////////////////////
#define mpiSeriesInfo 10323 // Идентификатор для хранения информации о сериях
///////////////////////////////////////////////////////////////////////////////
// Г Л О Б А Л Ь Н Ы Е П Е Р Е М Е Н Н Ы Е //
THmsScriptMediaItem Podcast = GetRoot(); // Главная папка подкаста
string gsUrlBase = ''; // Url база ссылок нашего сайта (берётся из корневого элемента)
bool gbHttps = (LeftCopy(gsUrlBase, 5)=='https');
int gnTime = 6000;
int gnTotalItems = 0;
int gnQual = 0; // Минимальное качество для отображения
TDateTime gStart = Now;
string gsSeriesInfo = ''; // Информация о сериях сериала (названия)
string gsHeaders = mpFilePath+'\r\n'+
'Accept: application/json, text/javascript, */*; q=0.01\r\n'+
'Accept-Encoding: identity\r\n'+
'User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36\r\n'+
'X-Requested-With: XMLHttpRequest\r\n';
///////////////////////////////////////////////////////////////////////////////
// Ф У Н К Ц И И //
///////////////////////////////////////////////////////////////////////////////
// Установка переменной Podcast: поиск родительской папки, содержащий скрипт
THmsScriptMediaItem GetRoot() {
Podcast = PodcastItem;
while ((Trim(Podcast[550])=='') && (Podcast.ItemParent!=nil)) Podcast=Podcast.ItemParent;
return Podcast;
}
///////////////////////////////////////////////////////////////////////////////
// Декодирование ссылок для HTML5 плеера
string Html5Decode(string sEncoded) {
if ((sEncoded=="") || (Pos(".", sEncoded) > 0)) return sEncoded;
if (sEncoded[1]=="#") sEncoded = Copy(sEncoded, 2, Length(sEncoded)-1);
string sDecoded = "";
for (int i=1; i <= Length(sEncoded); i+=3)
sDecoded += "\\u0" + Copy(sEncoded, i, 3);
return HmsJsonDecode(sDecoded);
}
//////////////////////////////////////////////////////////////////////////////
// Авторизация на сайте
bool LoginToFilmix() {
string sName, sPass, sLink, sData, sPost, sRet, sDomen;
HmsRegExMatch('//([^/]+)', gsUrlBase, sDomen);
int nPort = 443, nFlags = 0x10; // INTERNET_COOKIE_THIRD_PARTY;
if ((Trim(mpPodcastAuthorizationUserName)=='') ||
(Trim(mpPodcastAuthorizationPassword)=='')) {
//ErrorItem('Не указан логин или пароль');
//return false;
return true; // Не включена авторизация - работаем так, без неё.
}
sName = HmsHttpEncode(HmsUtf8Encode(mpPodcastAuthorizationUserName)); // Логин
sPass = HmsHttpEncode(HmsUtf8Encode(mpPodcastAuthorizationPassword)); // Пароль
sPost = 'login_name='+sName+'&login_password='+sPass+'&login_not_save=0&login=submit';
sData = HmsSendRequestEx(sDomen, '/engine/ajax/user_auth.php', 'POST', 'application/x-www-form-urlencoded; charset=UTF-8', gsHeaders, sPost, nPort, nFlags, sRet, true);
if (!HmsRegExMatch('AUTHORIZED', sData, '')) {
ErrorItem('Не прошла авторизация на сайте '+sDomen+'. Неправильный логин/пароль?');
return false;
}
return true;
}
///////////////////////////////////////////////////////////////////////////////
// ---- Создание ссылки на видео ----------------------------------------------
THmsScriptMediaItem AddMediaItem(THmsScriptMediaItem Folder, string sTitle, string sLink, string sGrp='') {
HmsRegExMatch('\\[.*?\\](.*)', sLink, sLink);
THmsScriptMediaItem Item = HmsCreateMediaItem(sLink, Folder.ItemID, sGrp); // Создаём ссылку
Item[mpiTitle ] = sTitle; // Наименование
Item[mpiCreateDate] = DateTimeToStr(IncTime(gStart, 0, 0, -gnTotalItems, 0));
// Item[mpiDirectLink] = True;
// Тут наследуем от родительской папки полученные при загрузке первой страницы данные
Item.CopyProperties(PodcastItem, [mpiThumbnail, mpiTimeLength, mpiGenre, mpiYear]);
gnTotalItems++; // Увеличиваем счетчик созданных элементов
return Item; // Возвращаем созданный объект
}
///////////////////////////////////////////////////////////////////////////////
// --- Создание папки видео ---------------------------------------------------
THmsScriptMediaItem CreateFolder(string sName, string sLink, string sImg='') {
THmsScriptMediaItem Item = PodcastItem.AddFolder(sLink); // Создаём папку с указанной ссылкой
Item[mpiTitle ] = sName; // Присваиваем наименование
Item[mpiThumbnail ] = sImg; // Картинку устанавливаем, которая указана у текущей папки
Item[mpiCreateDate] = DateTimeToStr(IncTime(gStart, 0, 0, -gnTotalItems, 0));
// Тут наследуем от родительской папки полученные при загрузке первой страницы данные
Item.CopyProperties(PodcastItem, [mpiThumbnail, mpiTimeLength, mpiGenre, mpiYear]);
gnTotalItems++; // Увеличиваем счетчик созданных элементов
return Item; // Возвращаем созданный объект
}
///////////////////////////////////////////////////////////////////////////////
// Создание ссылки-ошибки
void ErrorItem(string sMsg) {
THmsScriptMediaItem Item = HmsCreateMediaItem('Err', PodcastItem.ItemID);
Item[mpiTitle ] = sMsg;
Item[mpiThumbnail ] = 'http://wonky.lostcut.net/icons/symbol-error.png';
}
///////////////////////////////////////////////////////////////////////////////
// ---- Создание информационной ссылки ----------------------------------------
void AddInfoItem(string sTitle) {
THmsScriptMediaItem Item = HmsCreateMediaItem('-Info'+IntToStr(PodcastItem.ChildCount), PodcastItem.ItemID);
Item[mpiTitle ] = HmsHtmlToText(sTitle); // Наименование (Отображаемая информация)
Item[mpiTimeLength] = 1; // Т.к. это псевдо ссылка, то ставим длительность 1 сек.
Item[mpiThumbnail ] = 'http://wonky.lostcut.net/vids/info.jpg'; // Ставим иконку информации
Item[mpiCreateDate] = DateTimeToStr(IncTime(gStart, 0, 0, -gnTotalItems, 0));
gnTotalItems++;
}
///////////////////////Получение случайного варианта сервера из предлагаемых/////////
string GetRandomServerFile(string sLink) {
string sVal;
sLink = ReplaceStr(sLink, " or " , "|");
sLink = ReplaceStr(sLink, " \\or " , "|");
sLink = ReplaceStr(sLink, " or\\s* " , "|");
sLink = ExtractWord(int(Random()*WordCount(sLink, "|"))+1, sLink, "|");
return sLink;
}
///////////////////////////////////////////////////////////////////////////////
// ---- Создание ссылок на файл(ы) по переданной ссылке (шаблону) -------------
void CreateVideoLinks(THmsScriptMediaItem Folder, string sName, string sLink, bool bSeparateInFolders = false) {
TStrings LIST = TStringList.Create(); // Создаём объект для хранения списка ссылок
try {
LIST.Text = ReplaceStr(sLink, ',', '\n'); // Загружаем ссылки разделённые запятой в список
if (LIST.Count < 2) bSeparateInFolders = false; // Если ссылок одна - то не рассовываем по пакам с именем качества
for (int i=0; i < LIST.Count; i++) {
string sUrl = LIST[i], sQual = ''; // Получаем очередную ссылку из списка
HmsRegExMatch('(\\[.*?\\])(.*)', sUrl, sQual); // Получаем название качества
if (bSeparateInFolders) // Если установлен флаг распихивания разного качества по папкам
AddMediaItem(Folder, sName, sUrl, sQual); // - то создаём ссылку в папке с названием качества
else // Иначе просто создаём ссылку, впереди названия которой будет указано качество
AddMediaItem(Folder, Trim(sQual+' '+sName), sUrl);
}
} finally { LIST.Free; } // Освобождаем объект из памяти
}
///////////////////////////////////////////////////////////////////////////////
// ---- Создание серий из плейлиста -------------------------------------------
void CreateSeriesFromPlaylist(THmsScriptMediaItem Folder, string sLink, string sName='') {
string sData,sLink1, sLink2,sLink3, s1, s2, s3; int i; TJsonObject JSON, PLITEM, INFO; TJsonArray PLAYLIST, INFOLIST; // Объявляем переменные
int nSeason=0, nEpisode=0; string sVal; THmsScriptMediaItem Item;
// Если передано имя плейлиста, то создаём папку, в которой будем создавать элементы
if (Trim(sName)!='') Folder = Folder.AddFolder(sName);
// Если в переменной sLink сожержится знак '{', то там не ссылка, а сами данные Json
if (Pos('{', sLink)>0) {
sData = sLink;
} else {
sData = HmsDownloadURL(sLink, "Referer: "+gsHeaders); // Загружаем плейлист
if (LeftCopy(sData, 1)=="#")
sData = BaseDecode(sData); // Дешифруем
}
INFO = TJsonObject.Create();
JSON = TJsonObject.Create(); // Создаём объект для работы с Json
try {
INFO.LoadFromString(gsSeriesInfo); // Загрудаем информацию о названиях серий (если есть)
JSON.LoadFromString(sData); // Загружаем json данные в объект
PLAYLIST = JSON.AsArray; // Получаем объект как массив
if (PLAYLIST!=nil) { // Если получили массив, то запускаем обход всех элементов в цикле
for (i=0; i<PLAYLIST.Length; i++) {
PLITEM = PLAYLIST[i]; // Получаем текущий элемент массива
sName = PLITEM.S['title'];
sLink = PLITEM.S['file' ]; // Получаем значение ссылки на файл
sName = HmsUtf8Decode(sName); // В данном случае, у нас названия в UTF-8
// Форматируем числовое представление серий в названии
// Если в названии есть число, то будет в s1 - то, что стояло перед ним, s2 - само число, s3 - то, что было после числа
if (HmsRegExMatch3('^(.*?)(\\d+)(.*)$', sName, s1, s2, s3)) {
if (PLAYLIST.Length>99)
sName = Format('%.3d %s %s', [StrToInt(s2), s1, s3]); // Форматируем имя - делаем число двухцифровое (01, 02...)
else
sName = Format('%.2d %s %s', [StrToInt(s2), s1, s3]); // Форматируем имя - делаем число двухцифровое (01, 02...)
}
// Получаем случайную ссылку из списка указанных (т.е. если встречаются "or" или "and")
sLink = ReplaceStr(ReplaceStr(sLink, " or ", "|"), " \\or ", "|"); // Заменяем все ключевые слова между ссылками на знак "|"
sLink = ExtractWord(Int(Random * WordCount(sLink, "|"))+1, sLink, "|"); // Получаем случайную строку из списка строк, разделённых знаком "|"
// Если это серия сериала, пытаемся получить название серии из информации
if (HmsRegExMatch2('s(\\d+)e(\\d+)', PLITEM.S['id'], s1, s2)) {
if (INFO['message\\episodes\\'+s1]!=nil) {
// Если есть инфа об этом сезоне - ищем наш номер эпизода
INFOLIST = INFO['message\\episodes\\'+s1].AsArray;
for (int e=0; e < INFOLIST.Length; e++) {
if (INFOLIST[e].S['e']==s2) {
// Нашли номер эпизода, получаем его название
sName = HmsUtf8Decode(INFOLIST[e].S['n']);
// Форматируем - ставим номер эпизода в начало названия
if (PLAYLIST.Length>99)
sName = Format('%.3d '+Trim(sName), [StrToInt(s2)]);
else
sName = Format('%.2d '+Trim(sName), [StrToInt(s2)]);
break;
}
}
}
}
// Проверяем, если это вложенный плейлист - запускаем создание элементов из этого плейлиста рекурсивно
if (PLITEM.B['folder'])
CreateSeriesFromPlaylist(Folder, PLITEM.S['folder'], sName);
else {
CreateVideoLinks(Folder, sName, sLink, true); // Это не плейлист - просто создаём ссылки на видео
}
}
} // end if (PLAYLIST!=nil)
} finally { JSON.Free; INFO.Free; } // Какие бы ошибки не случились, освобождаем объект из памяти
}
///////////////////////////////////////////////////////////////////////////////
// Декодирование Base64 с предворительной очисткой от мусора
string BaseDecode(string sData) {
HmsRegExMatch('#2(.*)', sData, sData);
Variant tr=['\\','//Y2VyY2EudHJvdmEuc2FnZ2V6emE=','//a2lub2NvdmVyLnc5OC5uamJo','//c2ljYXJpby4yMi5tb3ZpZXM='];
// Убираем перечисленный в массиве мусор за несколько проходов, ибо один мусор может быть разбавлен в середине другим
for (int n=0; n<3; n++) for (int i=0; i<Length(tr); i++) sData = ReplaceStr(sData, tr[i], '');
string sResult = HmsBase64Decode(sData);
return sResult;
}
///////////////////////////////////////////////////////////////////////////////
// Создание ссылок на видео-файл или серии
void CreateLinks() {
String sHtml, sData, sName, sLink, sID, sVal, sServ, sPage, sPost, sKey;
THmsScriptMediaItem Item; TRegExpr RegExp; int i, nCount, n; TJsonObject JSON, TRANS;
sHtml = HmsDownloadURL(mpFilePath, "Referer: "+gsHeaders); // Загружаем страницу сериала
sHtml = HmsUtf8Decode(HmsRemoveLineBreaks(sHtml));
if (!HmsRegExMatch('data-id="(\\d+)"', sHtml, sID)) {
HmsLogMessage(1, "Невозможно найти видео ID на странице фильма.");
return;
};
HmsRegExMatch('//(.*)', gsUrlBase, sServ);
if (HmsRegExMatch('--quality=(\\d+)', mpPodcastParameters, sVal)) gnQual = StrToInt(sVal);
//POST https://filmix.co/api/episodes/get?post_id=103435&page=1 // episodes name
//POST https://filmix.co/api/torrent/get_last?post_id=103435 // tottent file info
// -------------------------------------------------
// Собираем информацию о фильме
if (HmsRegExMatch('Время:(.*?)<br', sHtml, sData)) {
if (HmsRegExMatch('(\\d+)\\s+мин', ' '+sData, sVal)) {
gnTime = StrToInt(sVal)*60+120; // Из-за того что серии иногда длинее, добавляем пару минут
}
PodcastItem[mpiTimeLength] = gnTime;
}
HmsRegExMatch('/year-(\\d{4})"', sHtml, PodcastItem[mpiYear]);
if (HmsRegExMatch('(<a[^>]+genre.*?)</div>', sHtml, sVal)) PodcastItem[mpiGenre] = HmsHtmlToText(sVal);
// -------------------------------------------------
int nPort = 80; if (gbHttps) nPort = 443;
gsSeriesInfo = HmsSendRequestEx(sServ, '/api/episodes/get', 'POST', 'application/x-www-form-urlencoded; charset=UTF-8', gsHeaders, 'post_id='+sID, nPort, 16, '', true);
sData = HmsSendRequestEx(sServ, '/api/movies/player_data', 'POST', 'application/x-www-form-urlencoded; charset=UTF-8', gsHeaders, 'post_id='+sID, nPort, 16, sVal, true);
JSON = TJsonObject.Create();
try {
JSON.LoadFromString(sData);
TRANS = JSON['message\\translations\\video'];
nCount = TRANS.Count; // Количество озвучек
for (i=0; i<nCount; i++) {
sName = TRANS.Names[i];
sLink = TRANS.S[sName];
sName = HmsUtf8Decode(sName);
sLink = HmsExpandLink(BaseDecode(sLink), gsUrlBase);
sLink = GetRandomServerFile(sLink);
// Проверяем, ссылка эта на плейлист?
if (HmsRegExMatch('/pl/', sLink, '')) {
if (nCount > 1) {
// Количество озвучек больше одного - создаём просто папки с названием озвучки
Item = CreateFolder(sName, sLink);
Item[mpiSeriesInfo] = gsSeriesInfo;
} else
// Иначе создаём ссылки на серии из плейлиста
CreateSeriesFromPlaylist(PodcastItem, sLink);
} else {
// Это не плейлист - просто создаём ссылку на видео
CreateVideoLinks(PodcastItem, sName, sLink);
}
}
if (nCount==0) ErrorItem('Видео не доступно');
} finally { JSON.Free; }
// Добавляем ссылку на трейлер, если есть
if (HmsRegExMatch('data-id="trailers"><a[^>]+href="(.*?)"', sHtml, sLink)) {
Item = AddMediaItem(PodcastItem, 'Трейлер', sLink); // Это не плейлист - просто создаём ссылки на видео
Item[mpiTimeLength] = 4 * 60;
}
// Создаём информационные элементы (если указан ключ --addinfoitems в дополнительных параметрах)
if (Pos('--addinfoitems', mpPodcastParameters) > 0) {
if (HmsRegExMatch('(<div[^>]+contry.*?)</div' , sHtml, sName)) AddInfoItem(HmsHtmlToText(sName));
//if (HmsRegExMatch('(<div[^>]+directors.*?)</div', sHtml, sName)) AddInfoItem(HmsHtmlToText(sName));
if (HmsRegExMatch('(Жанр:</span>.*?)</div' , sHtml, sName)) AddInfoItem(HmsHtmlToText(sName));
if (HmsRegExMatch('(<div[^>]+translate.*?)</div', sHtml, sName)) AddInfoItem(HmsHtmlToText(sName));
if (HmsRegExMatch('(<div[^>]+quality.*?)</div' , sHtml, sName)) AddInfoItem(HmsHtmlToText(sName));
if (HmsRegExMatch2('<span[^>]+imdb.*?<p>(.*?)</p>.*?<p>(.*?)</p>', sHtml, sName, sVal)) {
if ((sName!='-') && (sName!='0')) AddInfoItem("IMDB: "+sName+" ("+sVal+")");
}
}
}
///////////////////////////////////////////////////////////////////////////////
// Г Л А В Н А Я П Р О Ц Е Д У Р А //
///////////////////////////////////////////////////////////////////////////////
{
HmsRegExMatch('^(.*?//[^/]+)', Podcast[mpiFilePath], gsUrlBase); // Получаем значение в gsUrlBase
gbHttps = (LeftCopy(gsUrlBase, 5)=='https'); // Флаг использования 443 порта для запросов
gsHeaders += ':authority: '+gsUrlBase+'\r\nOrigin: '+gsUrlBase+'\r\n';
if (PodcastItem.IsFolder) {
if (!LoginToFilmix()) return;
PodcastItem.DeleteChildItems;
// Если это папка, создаём ссылки внутри этой папки
if (HmsRegExMatch('/pl/', mpFilePath, '')) {
gsSeriesInfo = PodcastItem[mpiSeriesInfo];
CreateSeriesFromPlaylist(PodcastItem, mpFilePath);
} else
CreateLinks();
} else {
// Если это запустили файл на просмотр, присваиваем MediaResourceLink значение ссылки на видео-файл
if (HmsRegExMatch('/(trejlery|trailers)', mpFilePath, '')) {
string sHtml = HmsDownloadURL(mpFilePath, 'Referer: '+gsHeaders);
if (HmsRegExMatch('"video5-link"\\s*value="(.*?)"', sHtml, MediaResourceLink))
MediaResourceLink = Html5Decode(MediaResourceLink);
string sQualSection='', sQual='';
if (HmsRegExMatch('(\\[.*?\\])', MediaResourceLink, sQualSection)) { // Если в ссылке есть секция перечисления доступного качества в квадратных скобках
HmsRegExMatch('(\\d+)', sQualSection, sQual); // Берём первое качество в перечислении (обычно самое большое)
MediaResourceLink = ReplaceStr(MediaResourceLink, sQualSection, sQual); // Заменяем в ссылке секцию перечисления качеств на конкретное выбранное
}
} else
MediaResourceLink = mpFilePath;
}
}
551
C++Script
215
Unsorted
55
https://filmix.co/templates/Filmix/images/logo.png
527
--yearintitle --addinfoitems
100602
1530446354
100702
d9758a32a5e8815c4bc131f3e62b719e53fc07e6
100701
cb6a66f9020ab44d12ace7089c9316ab854bac59
100704
67c133ca599e32f12e620c597b5824a689866210
50
Фильмы (основной)_480x270
-
51
4cf68ee55c7d9377477965be11e5a097
-SearchFolder
8719361c-395c-4f75-bdbb-9a08cde75ed6
515
2
512
2
532
2
700
2
553
2
42
3
4
0 Поиск
93
42325,9182519444
200104
597370a968ac50b7057c57b7b3edfa62
701
-1
702
-1
517
578-720,722-1080,482-576,402-480,322-400,202-320,0-200
518
0
522
0
570
0
245
4cf68ee55c7d9377477965be11e5a097
-
32
2d2dee08836f22a30f7a3f166f9e9b45
-SearchCommands
4cf68ee55c7d9377477965be11e5a097
515
2
512
2
532
2
700
2
553
2
42
3
4
"Набрать текст"
35
42623,6337152778
200
5
500
// Var 2017.07.01
THmsScriptMediaItem Podcast = GetRoot(); // Главная папка подкаста
int mpiFolderType = 200;
int mpiDynamicScript = 500;
int mpiDynamicSyntaxType = 501;
int mpiPreviousItemID = 200104;
int mpiDoNothing = 201100;
char gsSpace = 'Пробел';
char gsDelLastChar = 'Удалить последний символ';
char gsClearSearch = 'Очистить текст поиска';
char gsClearHystoryIn = 'Очистить историю поиска в папке "%s"';
char gsMsgClearHistory = 'История поиска в папке "%s" очищена';
char gsMsgTextSaved = 'Подкаст "%s" добавлен в "%s"';
char gsMsgNothingSaved = 'Текст поиска не набран! Добавлять нечего.';
char gsMsgSearchText = 'Текст поиска: %s';
char gsAddSearchTo = 'Добавить в папку "%s"';
char gsSuggestQuery = '/api/search/suggest?search_word=';
char gsSuggestResultCut= '';
char gsSuggestRegExpr = '"title":"(.*?)"';
char gsSuggestMethod = 'POST';
int gnSuggestNoUTFEnc = 0;
char gsSuggestMessage = 'Вариант: ';
int gnTotalItems=0; TDateTime gTimeStart = Now; char gsTextSearch, gsMsg='';
THmsScriptMediaItem goRootItem, goCmdItem;
// ------------------------------------------ Создание папок команд поиска ----
void CreateSearchCommands() {
int i; char sText; THmsScriptMediaItem Item;
CreateDynamicItem(FolderItem, '#', '-SearchCreateChars=From:32To:58');
CreateDynamicItem(FolderItem, 'A-Z', '-SearchCreateChars=From:65To:91');
CreateDynamicItem(FolderItem, 'А-Я', '-SearchCreateChars=From:192To:224');
CreateDynamicItem(FolderItem, gsClearSearch, '-SearchCmd=ClearSearchText');
// Создание команды добавления в корневую папку поиска
CreateDynamicItem(FolderItem, Format(gsAddSearchTo, [goRootItem[mpiTitle]]), '-SearchCmd=SaveSearchText');
// Создание команд добавления в папки, находящиеся в корневой, если поле "Файл" (mpiFilePath) у них пустое
for (i=0; i<goRootItem.ChildCount; i++) {
Item = goRootItem.ChildItems[i];
if (Item.ItemClassID!=51) continue;
CreateDynamicItem(FolderItem, Format(gsAddSearchTo, [Item[mpiTitle]]), '-SaveSearchTextTo='+Item.ItemID);
}
// Создание команды очистки истории в корневой папке поиска
CreateDynamicItem(FolderItem, Format(gsClearHystoryIn, [goRootItem[mpiTitle]]), '-SearchCmd=ClearSearchHistory');
// Создание команд очистки истории в папках, которые наодятся в корневой
for (i=0; i<goRootItem.ChildCount; i++) {
Item = goRootItem.ChildItems[i];
if (Item.ItemClassID!=51) continue;
CreateDynamicItem(FolderItem, Format(gsClearHystoryIn, [Item[mpiTitle]]), '-ClearSearchHistoryIn='+Item.ItemID);
}
// Создание ссылки, информирующей о текущем набранном тексте поиска
sText = Format(gsMsgSearchText, [gsTextSearch]);
Item = HmsCreateMediaItem(sText, goCmdItem.ItemID);
Item[mpiTitle ] = sText;
Item[mpiThumbnail] = 'http://wonky.lostcut.net/icons/search-icon1.jpg';
}
// ---------------------------- Добавление подкаста с именем текста поиска ----
void AddPodcastSearch(THmsScriptMediaItem prntItem) {
THmsScriptMediaItem Item;
if (Trim(gsTextSearch)=='') {gsMsg = gsMsgNothingSaved; return;}
if (LowerCase(gsTextSearch)==gsTextSearch) gsTextSearch = NameCase(gsTextSearch);
Item = prntItem.AddFolder(gsTextSearch, false);
Item[mpiFilePath ] = Format('search="%s"', [gsTextSearch]);
Item[mpiTitle ] = gsTextSearch;
HmsDatabaseAutoSave(false);
gsMsg = Format(gsMsgTextSaved, [gsTextSearch, prntItem[mpiTitle]]);
//gsTextSearch = '';
}
// --------- Функция создания динамической папки с унаследованным скриптом ----
void CreateDynamicItem(THmsScriptMediaItem prntItem, char sTitle, char sLink) {
char s; THmsScriptMediaItem Folder;
if (Trim(sTitle)=='') sTitle = gsSpace;
Folder = prntItem.AddFolder(sLink, true);
Folder[mpiTitle ] = sTitle;
Folder[mpiCreateDate ] = VarToStr(IncTime(gTimeStart,0,-gnTotalItems,0,0)); gnTotalItems++;
Folder[mpiFolderType ] = prntItem[mpiFolderType];
Folder[mpiDynamicScript ] = prntItem[mpiDynamicScript];
Folder[mpiDynamicSyntaxType] = prntItem[mpiDynamicSyntaxType];
Folder[mpiFolderSortOrder ] = prntItem[mpiFolderSortOrder];
}
///////////////////////////////////////////////////////////////////////////////
// Установка переменной Podcast: поиск родительской папки, содержащий скрипт
THmsScriptMediaItem GetRoot() {
Podcast = FolderItem; // Начиная с текущего элемента, ищется создержащий срипт
while ((Trim(Podcast[550])=='') && (Podcast.ItemParent!=nil)) Podcast=Podcast.ItemParent;
return Podcast;
}
// ---------------------------- MAIN PROCEDURE ------------------------------
{
int i, nCnt; char sCh, sCh1, sCh2, sText; THmsScriptMediaItem Item;
char s, sUrlServer = '', sRequestPage = '/', sPostData = '', sHeaders = '';
if (LeftCopy(mpFilePath, 1) != '-') return; // Если это не команда - то и не обрабатываем
// Поиск корневого каталога поиска (папки, которая содержит динамическую папку с путем "-SearchCommands")
goRootItem = FolderItem; goCmdItem = FolderItem;
while ((goRootItem.ItemParent != HmsDatabaseRootItem) && (goRootItem.ItemParent != nil)) {
if (goRootItem[mpiFilePath] == '-SearchCommands') {goCmdItem=goRootItem; goRootItem=goCmdItem.ItemParent; break;}
goRootItem = goRootItem.ItemParent;
}
// Если это повторный вызов, смены папки не произошло - ничего не делаем
if ((FolderItem.ItemID==goRootItem[mpiPreviousItemID]) && !DebugMode && (FolderItem!=goCmdItem)) return;
FolderItem.DeleteChildItems(); goRootItem[mpiPreviousItemID] = FolderItem.ItemID;
gsTextSearch = HmsGetUserSearchText(); // Получаем текущее значение текста поиска
// ---- Проверяем команды - по значению в mpFilePath ----
if (goRootItem[mpiDoNothing]=='1') { // Флаг "Ничего не делать" - например, при возврате
goRootItem[mpiDoNothing] = ''; // в команду набирания буквы из подпапки варианта
} else if (HmsRegExMatch('-SearchCommands', mpFilePath, sCh1)) { // Создание корневых команд поиска
CreateSearchCommands(); return;
} else if (HmsRegExMatch('-SearchChar=(\\d+)', mpFilePath, sCh1)) { // Добавление буквы (символа) к набираемому тексту поиска
gsTextSearch += Chr(StrToInt(sCh1));
} else if (HmsRegExMatch('-SetSearchText=(.*)', mpFilePath, gsTextSearch)) { // Назначить текст поиска значением варианта подсказки
goRootItem[mpiDoNothing] = '1'; gsSuggestQuery = ''; // включаем флаг не выполнять команду при возврате из этой папки
} else if (HmsRegExMatch('-SaveSearchTextTo=(.*)', mpFilePath, sCh1)) { // Добавление в папку Х. Поиск этой папки по ItemID.
Item = goRootItem; // Ищем папку с ItemID равному идентификатору, переданному в mpFilePath
for (i=0; i<goRootItem.ChildCount; i++) {
if (goRootItem.ChildItems[i].ItemID==sCh1) {Item = goRootItem.ChildItems[i]; break;}
}
AddPodcastSearch(Item); // и добавляем в найденную папку подкаст текстом поиска
} else if (HmsRegExMatch('-ClearSearchHistoryIn=(.*)', mpFilePath, sCh1)) { // Очистка истории (добавленных ранее) поисковых значений
Item = goRootItem; // Ищем папку с ItemID равному идентификатору, переданному в mpFilePath
for (i=0; i<goRootItem.ChildCount; i++) {
if (goRootItem.ChildItems[i].ItemID==sCh1) {Item = goRootItem.ChildItems[i]; break;}
}
for(i=0; i<Item.ChildCount; i++) { // Удаляем все элементы с начинающимся словом 'search' в поле mpiFilePath
if (LeftCopy(Item.ChildItems[i].Properties[mpiFilePath], 6)=='search') {Item.ChildItems[i].Delete();i--;}
}
gsMsg = Format(gsMsgClearHistory, [Item[mpiTitle]]); // вывод сообщения, что история очищена
} else if (HmsRegExMatch('-SearchCmd=(\\w+)', mpFilePath, sCh1)) {
if (sCh1=='DeleteLastChar' ) gsTextSearch = LeftCopy(gsTextSearch, Length(gsTextSearch)-1); // Удаление последнего символа
else if (sCh1=='SaveSearchText' ) AddPodcastSearch(goRootItem); // Добавить текст поиска в корневую папку
else if (sCh1=='ClearSearchText') gsTextSearch = ''; // Очистка текста поиска
else if (sCh1=='ClearSearchHistory') { // Очистка истории (добавленных значений поиска)
for(i=0; i<goRootItem.ChildCount; i++) {
Item = goRootItem.ChildItems[i]; // Ищем все элементы, у которых значение mpiFilePath начиначется с 'search'
if (LeftCopy(Item[mpiFilePath], 6)=='search') {goRootItem.ChildItems[i].Delete();i--;}
}
gsMsg = Format(gsMsgClearHistory, [goRootItem[mpiTitle]]);
}
} else if (HmsRegExMatch2('-SearchCreateChars=From:(\\d+)To:(\\d+)', mpFilePath, sCh1, sCh2)) { // Создание списка букв/символов
CreateDynamicItem(FolderItem, gsDelLastChar, '-SearchCmd=DeleteLastChar Suggestions'); // В начало - команда удаления символа
CreateDynamicItem(FolderItem, ' ', '-SearchChar=32 Suggestions'); // Пробел
for (i= StrToInt(sCh1); i<StrToInt(sCh2); i++) CreateDynamicItem(FolderItem, Chr(i), '-SearchChar='+IntToStr(i)+' Suggestions');
// слово "Suggestions" добавлено к значению mpiFilePath тек команд, в которых возможно использование подсказок
}
else return; // Если неизвестная нам команда - просто выходим
HmsSetUserSearchText(gsTextSearch); // Устанавливаем значение текста поиска
Item = HmsCreateMediaItem('-command=none', FolderItem.ItemID);
if (gsMsg=='') { // Если сообщения небыло - просто выводим ссылку с текущим значением набранного текста
Item[mpiThumbnail] = 'http://wonky.lostcut.net/icons/search-icon1.jpg';
Item[mpiFilePath ] = Format(gsMsgSearchText, [gsTextSearch]);
} else { // Выводим сообщение
Item[mpiThumbnail] = 'http://wonky.lostcut.net/icons/ok.png';
Item[mpiFilePath ] = gsMsg;
}
Item = HmsCreateMediaItem('-command=none', FolderItem.ItemParent.ItemID); // В родительской папке (выше) обновляем информацию о текущем значении текста
Item[mpiFilePath] = Format(gsMsgSearchText, [gsTextSearch]);
Item[mpiThumbnail] = 'http://wonky.lostcut.net/icons/search-icon1.jpg';
Item = HmsCreateMediaItem('-command=none', goCmdItem.ItemID); // Также в папке, содержащую главные команды поиска
Item[mpiFilePath] = Format(gsMsgSearchText, [gsTextSearch]);
Item[mpiThumbnail] = 'http://wonky.lostcut.net/icons/search-icon1.jpg';
// Suggestions ------ Блок работы с подсказками -------
if ((gsSuggestQuery!='') && (Pos('Suggestions', mpFilePath)>0) && (Length(gsTextSearch)>1)) {
sText = gsTextSearch; if (gnSuggestNoUTFEnc==0) sText = HmsUtf8Encode(sText); // Если не указано не кодировать в UTF - кодируем
sText = HmsHttpEncode(sText); string sUrlBase;
// Если есть ключ <TEXT> в запросе - заменяем его на значение набранного текста, иначе просто добавляем в конец
if (Pos('<TEXT>', gsSuggestQuery)>0) gsSuggestQuery = ReplaceStr(gsSuggestQuery, '<TEXT>', sText);
else gsSuggestQuery = gsSuggestQuery + sText;
HmsRegExMatch2('^(.*?//([^/]+))', Podcast[mpiFilePath], sUrlBase, sUrlServer); // Получаем значение в gsUrlBase
sRequestPage = gsSuggestQuery;
int nPort = 80; if (LeftCopy(gsSuggestQuery, 5)=="https") nPort = 443;
if (gsSuggestMethod=='POST') HmsRegExMatch2('^(.*?)\\?(.*)', sRequestPage, sRequestPage, sPostData);
sHeaders = sUrlBase+'/\r\n'+
'Accept-Encoding: gzip, deflate\r\n'+
'User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko/20100101 Firefox/13.0\r\n'+
'Connection: Keep-Alive\r\n'+
'X-Requested-With: XMLHttpRequest\r\n'+
'Origin: '+sUrlBase+'/\r\n'+
'Accept: application/json, text/javascript, */*; q=0.01\r\n'; // Для включения возможности gzip в запросах
sText = HmsSendRequestEx(sUrlServer, sRequestPage, gsSuggestMethod, 'application/x-www-form-urlencoded; charset=UTF-8', sHeaders, sPostData, nPort, 0x10, '', true);
sText = HmsUtf8Decode(sText);
if (gsSuggestResultCut!='') HmsRegExMatch(gsSuggestResultCut, sText, sText);// Если есть выражение обрезки - обрезаем
sText = HmsJsonDecode(sText); TRegExpr t = TRegExpr.Create('(<[^>]+>)'); // Избавляемся от тегов в середине слов подсказки
TRegExpr reSearch = TRegExpr.Create(gsSuggestRegExpr, PCRE_SINGLELINE);
if (reSearch.Search(sText)) do {
s = reSearch.Match;
if (t.Search(s)) do s=ReplaceStr(s, t.Match, ''); while (t.SearchAgain());// (функция HmsHtmlToText не подходит т.к. ставит пробел в середине слова)
if (HmsRegExMatch('^(.*?)[/\\(\\|]', s, sCh)) { // Обрезаем подсказку до знаков /, ( или |
if (Pos(LowerCase(gsTextSearch), LowerCase(sCh))>0) s = sCh; // Если после этого в подсказке встречается набранный текст - то так и оставляем
}
if (LowerCase(s)==s) s = NameCase(s); // Если подсказки - все маленькие буквы, делаем NameCase
// Если в подсказке больше одного слова - дополнительно создаём сначала подсказки из слов, которые содержат набранный текст (выделяем слова отдельно)
if (WordCount(s, ' ')>1) {
nCnt = WordCount(s, ' ');
for (i=1; i<=nCnt; i++) {
sCh=ExtractWord(i, s, ' '); if (Trim(sCh)=='') continue;
if (Pos(LowerCase(gsTextSearch), LowerCase(sCh))<1) continue;
if (LowerCase(gsTextSearch)==LowerCase(sCh)) continue;
sCh = ReplaceStr(sCh, ':', ''); sCh=ReplaceStr(sCh, '\\', '');
CreateDynamicItem(FolderItem, gsSuggestMessage+sCh, '-SetSearchText='+sCh);
}
}
// Создаём папку с предложением варианта (подсказку)
if (LowerCase(s)!=LowerCase(gsTextSearch)) CreateDynamicItem(FolderItem, gsSuggestMessage+s, '-SetSearchText='+s);
if (gnTotalItems>100) break; // Ограничиваем количество создаваемых элементов = 100
} while (reSearch.SearchAgain());
}
HmsIncSystemUpdateID(); // Говорим устройству об обновлении содержания
}
501
C++Script
215
-mpCreateDate
93
42623,6344060764
245
2d2dee08836f22a30f7a3f166f9e9b45
-
53
173e72713389c895a3b7451604db41b9
/
8719361c-395c-4f75-bdbb-9a08cde75ed6
515
2
512
2
532
2
700
2
553
2
42
3
4
1 Последние поступления
93
43444,7521568403
525
43450,8025123032
-
53
d25e2e46a282d6a92a9ea940e4c67aee
/films
8719361c-395c-4f75-bdbb-9a08cde75ed6
515
2
512
2
532
2
700
2
553
2
42
3
4
2 Новые фильмы
93
43444,7521568403
525
43450,769030544
-
53
a02d6465ea03a0ebe61faa74d109a452
/popular/films
8719361c-395c-4f75-bdbb-9a08cde75ed6
515
2
512
2
532
2
700
2
553
2
42
3
4
3 Популярные фильмы
93
43444,7521568403
525
43450,7257961574
-
53
07ac86617ecccfb4fc3439c770e1933c
/multfilmy
8719361c-395c-4f75-bdbb-9a08cde75ed6
515
2
512
2
532
2
700
2
553
2
42
3
4
4 Мультфильмы
93
43444,7521568403
-
53
611670c5ab3c98094cd5d79d17c164f3
/multserialy
8719361c-395c-4f75-bdbb-9a08cde75ed6
515
2
512
2
532
2
700
2
553
2
42
3
4
5 Мультсериалы
527
--pages=10
93
43444,7521568403
-
53
c6bbc5387e8450f294ba9751072351a7
/serialy
8719361c-395c-4f75-bdbb-9a08cde75ed6
515
2
512
2
532
2
700
2
553
2
42
3
4
6 Сериалы
527
--pages=20
93
43444,7521568403
525
43450,7305213194
-
51
8b5804aa4282e79205251ca245a9bd2a
7 По категориям
8719361c-395c-4f75-bdbb-9a08cde75ed6
515
2
512
2
532
2
700
2
553
2
42
3
93
43444,7521568403
-
53
f9bb192b96fb1e13e026b3e13d65cd51
https://filmix.gold/films/c996
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Зарубежные
93
43323,6564587616
-
53
0c739cea3dfa2edb938475fd2dc01d3b
https://filmix.gold/films/c6
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Русские
93
43323,6564587616
-
53
45bfb1176969164443544d698470a9e9
https://filmix.gold/films/c64
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Советские
93
43323,6564587616
-
53
7d988c3656789b550dafd86a6507cb16
https://filmix.gold/top250
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Топ 250
93
43323,6564587616
-
53
83249edec31835d5e6b5ab005d3cc5d5
https://filmix.gold/anime
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Аниме
93
43323,6564587616
-
53
1d12ff5e0fbebcd49ae865a142222a27
https://filmix.gold/biografia
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Биография
93
43323,6564587616
-
53
4fbef8986cf985926aea2e680ef2cd4a
https://filmix.gold/boeviki
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Боевики
93
43323,6564587616
-
53
bd773ad80c630e45da6ab8b3d455fe65
https://filmix.gold/vestern
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Вестерн
93
43323,6564587616
-
53
43a3226d20c7434cdf3a13283ec8a819
https://filmix.gold/voenniy
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Военный
93
43323,6564587616
-
53
914d5c1533c67f874b237e1c66be0a13
https://filmix.gold/detektiv
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Детектив
93
43323,6564587616
-
53
66c87da2544341300734fa3e039f77a1
https://filmix.gold/detskij
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Детский
93
43323,6564587616
-
53
2a6062b1e9ef22ee4b03f4274cbd22fc
https://filmix.gold/for_adults
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Для взрослых
93
43323,6564587616
-
53
76e8151389acca5413d334390ff16af5
https://filmix.gold/dokumentalenye
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Документальные
93
43323,6564587616
-
53
8fc2d5870b2915302a6d4d3abfc29a9f
https://filmix.gold/dramy
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Драмы
93
43323,6564587616
-
53
d4de3717606a4b33ff7abaaa155c77ec
https://filmix.gold/istoricheskij
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Исторический
93
43323,6564587616
-
53
7a7242bc59705b092a968d3fbe4a0141
https://filmix.gold/komedii
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Комедии
93
43323,6564587616
-
53
1e09a7ec310de1f495fc74b861a614a9
https://filmix.gold/korotkometragka
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Короткометражка
93
43323,6564587616
-
53
3135b8bfdf751f64fb808865e0827728
https://filmix.gold/kriminal
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Криминал
93
43323,6564587616
-
53
555b5bec85496ec5075016a705b9eb8f
https://filmix.gold/melodramy
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Мелодрамы
93
43323,6564587616
-
53
29821e490a505a82d6271b599d18d630
https://filmix.gold/mistika
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Мистика
93
43323,6564587616
-
53
0d78d9ab03743596f29bce70c6e7a3ca
https://filmix.gold/music
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Музыка
93
43323,6564587616
-
53
769ed4129b876ca6b6193bc66e3242f0
https://filmix.gold/muzkl
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Мюзикл
93
43323,6564587616
-
53
4685bfc45b26d9371d585afc03fcc718
https://filmix.gold/novosti
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Новости
93
43323,6564587616
-
53
ab7a2181b13159c57ddb934089784375
https://filmix.gold/original
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Оригинал
93
43323,6564587616
-
53
ce23b80582e0a9d8d7f9f6c4a5eb8447
https://filmix.gold/otechestvennye
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Отечественные
93
43323,6564587616
-
53
5e4f17c1b9fde9fbf1070d3fc61fde17
https://filmix.gold/tv
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Передачи с ТВ
93
43323,6564587616
-
53
6f2dabbb6ee31afea0aa1454505b1d40
https://filmix.gold/priklucheniya
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Приключения
93
43323,6564587616
-
53
59fba447c1f6c712aa4bd9f803deae44
https://filmix.gold/real_tv
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Реальное ТВ
93
43323,6564587616
-
53
e773d62efcdf70997b7b195d6b7b5495
https://filmix.gold/semejnyj
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Семейный
93
43323,6564587616
-
53
ac4e6ff6d66e3a3f10a5096aeb9a08b9
https://filmix.gold/sport
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Спорт
93
43323,6564587616
-
53
583b61069661fa6b6eb118509184b839
https://filmix.gold/talk_show
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Ток-шоу
93
43323,6564587616
-
53
ddda5d8322cba4b7ec6dc716ed63b55b
https://filmix.gold/trillery
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Триллеры
93
43323,6564587616
-
53
cc621c99cfffebff488143296ab5efbc
https://filmix.gold/uzhasy
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Ужасы
93
43323,6564587616
-
53
c98b487c626177ee30b223b88746200b
https://filmix.gold/fantastika
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Фантастика
93
43323,6564587616
-
53
54840e0725c879bbf835c6382a1ba41c
https://filmix.gold/film_noir
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Фильм-нуар
93
43323,6564587616
-
53
bf1d99e0556795beb2a1fc0efea1767e
https://filmix.gold/fjuntezi
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Фэнтези
93
43323,6564587616
-
53
31aadaff52c31f92440b0ca726afa403
https://filmix.gold/english
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
На английском
93
43323,6564587616
-
53
9749c2e82853d22a4e9e53ec0781465e
https://filmix.gold/ukrainskij
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
На украинском
93
43323,6564587616
-
53
b9fcc3212ee807cb15bc4dd07434eff9
https://filmix.co/films/c996
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Зарубежные
93
43444,7521568403
-
53
86e0b5a43b0874fd29d75bb92aa51700
https://filmix.co/films/c6
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Русские
93
43444,7521568403
-
53
1087c7ac8c5864ca9f1cceb91b76687e
https://filmix.co/films/c64
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Советские
93
43444,7521568403
-
53
ca45f67eec4de10307563dc419398040
https://filmix.co/top250
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Топ 250
93
43444,7521568403
-
53
3d53558ea35429271dd43d8650911386
https://filmix.co/anime
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Аниме
93
43444,7521568403
-
53
7bec23043e8b50d70c823c65dbcf0bcb
https://filmix.co/biografia
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Биография
93
43444,7521568403
-
53
64f9ad4c00b562a091b84acf7fe67f73
https://filmix.co/boeviki
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Боевики
93
43444,7521568403
-
53
a6da6ff18f30fe56d57d2ff1a3562639
https://filmix.co/vestern
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Вестерн
93
43444,7521568403
-
53
866ca18a0344af285bfa0f7e4ce0f5d3
https://filmix.co/voenniy
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Военный
93
43444,7521568403
-
53
0d437c49ed654bca419349d30a87ee2c
https://filmix.co/detektiv
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Детектив
93
43444,7521568403
-
53
36d1417f2fdff9d9fdfbbdc82a2ae9c6
https://filmix.co/detskij
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Детский
93
43444,7521568403
-
53
2b1ecde314239266ccb539f86cede2e5
https://filmix.co/for_adults
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Для взрослых
93
43444,7521568403
-
53
faa86229aac2bf81d1993e6191474b5d
https://filmix.co/dokumentalenye
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Документальные
93
43444,7521568403
-
53
b506d5ee56ef42d48495cd96d58c6147
https://filmix.co/dramy
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Драмы
93
43444,7521568403
-
53
efa8ffba5f023bc6505ac71bcc890c61
https://filmix.co/istoricheskij
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Исторический
93
43444,7521568403
-
53
4260ae864dc17ccbcdb844afa1afaeff
https://filmix.co/komedii
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Комедии
93
43444,7521568403
-
53
4a33b87a5be4691aa779955db07785ed
https://filmix.co/korotkometragka
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Короткометражка
93
43444,7521568403
-
53
95564eb004830e31b464faa95b48df49
https://filmix.co/kriminal
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Криминал
93
43444,7521568403
-
53
a2b2777ecdc49dce6a6814a2940696a5
https://filmix.co/melodramy
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Мелодрамы
93
43444,7521568403
-
53
d103fa5ae714a07cf66a943fd46972a6
https://filmix.co/mistika
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Мистика
93
43444,7521568403
-
53
089df8e92d8f62639b1f5311418ec1b8
https://filmix.co/music
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Музыка
93
43444,7521568403
-
53
8a4b41491edf2237b093ccc3d83401c3
https://filmix.co/muzkl
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Мюзикл
93
43444,7521568403
-
53
f5e269a0c06a3274c3e34a2926eb4c90
https://filmix.co/novosti
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Новости
93
43444,7521568403
-
53
a3c41d20b214ddb40499f08547273a18
https://filmix.co/original
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Оригинал
93
43444,7521568403
-
53
4b0d747625a3ebde58d14246d0592a3c
https://filmix.co/otechestvennye
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Отечественные
93
43444,7521568403
-
53
4009c6d4ddf4b23bae24e93893aba3b7
https://filmix.co/tv
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Передачи с ТВ
93
43444,7521568403
-
53
47dd5cec93643b37de4efb8a813faed5
https://filmix.co/priklucheniya
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Приключения
93
43444,7521568403
-
53
110459955bfaf9bd2603ffe9558cd384
https://filmix.co/real_tv
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Реальное ТВ
93
43444,7521568634
-
53
b8dd365e68b065f70a8d52a4fa1bfb1c
https://filmix.co/semejnyj
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Семейный
93
43444,7521568634
-
53
4718cadc0904ba2ef928c0ea0d55f195
https://filmix.co/sport
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Спорт
93
43444,7521568634
-
53
6b2706a10e6b80b2103502c037824734
https://filmix.co/talk_show
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Ток-шоу
93
43444,7521568634
-
53
36aa8fa154d57b20f399686795ce1ab9
https://filmix.co/trillery
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Триллеры
93
43444,7521568634
-
53
b68e154be10ca7d05431d7013c360129
https://filmix.co/uzhasy
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Ужасы
93
43444,7521568634
-
53
befeaa5476003c34b469b5a594369cef
https://filmix.co/fantastika
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Фантастика
93
43444,7521568634
-
53
101b851727d65587740fe5675e6acdd8
https://filmix.co/film_noir
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Фильм-нуар
93
43444,7521568634
-
53
0d05776ce66fb8eb58fd88e53c080b84
https://filmix.co/fjuntezi
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
Фэнтези
93
43444,7521568634
-
53
aaa8f00a3ccdf0c08b7b6adef701090d
https://filmix.co/english
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
На английском
93
43444,7521568634
-
53
3996a0ee5e975bb94ab13303629f0064
https://filmix.co/ukrainskij
8b5804aa4282e79205251ca245a9bd2a
515
2
512
2
532
2
700
2
553
2
42
3
4
На украинском
93
43444,7521568634