3
53
0959a36b-22f4-424c-aff2-68c2163d394e
TTV Autoplaylist
234DF17B-418C-4FDC-9DFE-CD0C586D2E76
4
TTV Autoplaylist test 4
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
245
0959a36b-22f4-424c-aff2-68c2163d394e
93
42037,9642572685
530
int gnTotal=0, gnImagesNotFound=0; String gsPlaylist='';
// ---- Преобразование имём с русскими символами в имя с английскими
string ru2Lat(string sName)
{
sName = LowerCase(sName);
Variant rus = ['ж' ,'ч' ,'ш' ,'щ' ,'я' ,'ь','ъ',' ','_',"'",'-'];
Variant lat = ['zh','ch','sh','sh','ya','' ,'' ,'' ,'' ,'' ,'' ];
for (int i=0; i<Length(rus); i++) sName = ReplaceStr(sName, rus[i], lat[i]);
string r = "абвгдеёзийклмнопрстуфхыэцю";
string l = "abvgdeezijklmnoprstufhyecu";
for (i=1; i<=Length(r); i++) sName = ReplaceStr(sName, r[i], l[i]);
return Trim(sName);
}
// ---- Создание файла m3u8 плейлиста (рекурсивно, начиная с укзанной папки)
void CreateM3U8_playlist(THmsScriptMediaItem Folder, String sFile, bool bContinue = False) {
String sGrp, sName, sLink, sImg, sServer, sVal; int i; THmsScriptMediaItem Item;
HmsRegExMatch('--server="(.*?)"', mpPodcastParameters, sServer);
// Цикл обхода всех элементов в папке Folder
for (i=0; i<Folder.ChildCount; i++) {
Item = Folder.ChildItems[i];
// Если элемент - папка, то запускаем формирование плейлиста для этой папки
if (Item.IsFolder) {
CreateM3U8_playlist(Item, "", True); // Да, это она - "Рекурсия"
continue;
}
if (bContinue) sGrp = Folder.Properties[mpiTitle];
else sGrp = "";
sName = Item.Properties[mpiTitle ];
sImg = Item.Properties[mpiThumbnail];
gsPlaylist += Format('#EXTINF:-1 group-title="%s" tvg-logo="%s" tvg-name="%.3d",%s\r\n', [sGrp, sImg, i+1, sName]);
gsPlaylist += 'http://'+sServer+'/MediaServer/VideoItems/'+Item.ItemID+'.mpg\r\n';
}
if (!bContinue) {
// Попытка записать сформированые данные в файл
try { HmsStringToFile('#EXTM3U\r\n'+HmsUtf8Encode(gsPlaylist), sFile); }
except { HmsLogMessage(1, "Не удалось записать файл "+sFile); }
}
}
// ----------------------------------------------------------------------------
void LoadPlaylist() {
string sData, sLink, sName, sGrp, sFile, sImg, sVal, sReplaceWhat='', sReplaceWith='';
THmsScriptMediaItem Item;
sFile = mpFilePath; if (Trim(mpComment)!='') sFile = mpComment;
HmsRegExMatch('--playlist="(.*?)"' , mpPodcastParameters, sFile);
HmsRegExMatch('--replaceWhat="(.*?)"', mpPodcastParameters, sReplaceWhat);
HmsRegExMatch('--replaceWith="(.*?)"', mpPodcastParameters, sReplaceWith);
if (HmsRegExMatch('^http', sFile, ''))
sData = HmsDownloadUrl(sFile, '', true);
else
sData = HmsStringFromFile(sFile);
sData = HmsUtf8Decode(sData);
if (sReplaceWhat!='') sData = ReplaceStr(sData, sReplaceWhat, sReplaceWith);
TRegExpr RE = TRegExpr.Create('#EXTINF:-?\\d?,?(.*?)[\\r\\n]([^\\r\\n]+)[\\r\\n$]', PCRE_SINGLELINE);
try {
if (RE.Search(sData)) do {
sName = RE.Match(1);
sLink = RE.Match(2);
sGrp = '';
if (HmsRegExMatch('.*\\((.*?)\\)', sName, sGrp)) sName = ReplaceStr(sName, '('+sGrp+')', '');
CreateLink(sLink, sName, sGrp);
if (HmsRegExMatch('\\b(HD)\\b', sName, sGrp)) {
CreateLink(sLink, sName, sGrp);
}
} while (RE.SearchAgain());
} finally { RE.Free(); }
HmsLogMessage(1, 'Всего каналов: '+IntToStr(gnTotal));
}
///////////////////////////////////////////////////////////////////////////////
// ---- Создание ссылки на канал с проверкой, не создана ли уже с таким именем
void CreateLink(string sLink, string sName, string sGrp) {
THmsScriptMediaItem Item, Folder = FolderItem; // Folder - текущая папка
sName = Trim(sName);
// Если указана группа - находим сначала её и делаем текущей папкой
if (sGrp!='') Folder = Folder.FindItemByProperty(mpiTitle, sGrp);
// Пытаемся найти элемент по наименованию в папке
if (sGrp!='')
Item = FolderItem.FindItemByProperty(mpiTitle, sGrp).FindItemByProperty(mpiTitle, sName);
else
Item = FolderItem.FindItemByProperty(mpiTitle, sName);
// Если не найден - создаём
if (Item == nil) Item = HmsCreateMediaItem(sLink, FolderItem.ItemID, sGrp);
// Обновляем всю информацию
Item[mpiFilePath ] = sLink;
Item[mpiTitle ] = sName;
Item[mpiThumbnail ] = 'http://wonky.lostcut.net/tvim/'+ru2Lat(sName)+'.png';
Item[mpiTimeLength ] = '11:40:00.000'; // длинная длительность
Item[mpiInternetItem ] = '1';
Item[mpiDVDAspectRatio] = '16:9';
Item[4001 ] = ''; // Снимаем пометку удаления
gnTotal++;
}
///////////////////////////////////////////////////////////////////////////////
// ---- Рекурсивное удаление старых помеченных на удаление ссылок -------------
void DeleteOldLinks(THmsScriptMediaItem CurrentFolder) {
int q; THmsScriptMediaItem Item;
// Проверяем пометку для удаления у всех вложенных элементов (начиная с последней)
for(q=CurrentFolder.ChildCount-1; q>=0; q--) {
Item = CurrentFolder.ChildItems[q];
if (Item.IsFolder)
DeleteOldLinks(Item); // Если это папка - удаляем ссылки в ней
else if(Item[4001]=='1')
Item.Delete(); // Иначе, если эта ссылка помечена на удаление - конец ей
}
}
// ----------------------------------------------------------------------------
{
// Помечаем все созданные ранее ссылки для удаления
for(int i=0; i<FolderItem.ChildCount; i++) {
for(int n=0; n<FolderItem.ChildItems[i].ChildCount; n++) {
FolderItem.ChildItems[i].ChildItems[n].Properties[4001] = '1';
}
}
LoadPlaylist();
// Удаляем помеченные для удаления ссылки начиная с текущей папки
DeleteOldLinks(FolderItem);
// Если в параметрах указан файл m3u8 - то запускаем функцию его создания
if (HmsRegExMatch('--m3u8="([^"]+)"', mpPodcastParameters, mpFilePath)) CreateM3U8_playlist(FolderItem, mpFilePath);
}
}
531
C++Script
527
--replaceWhat="192.168.2.1:82" --replaceWith="127.0.0.1:82"
525
42381,8883679282
550
string csCommandLine = 'cmd://"%s" --no-crashdump --play-and-exit --language en -Idummy --demuxdump-file="<OUTPUT FILE>" vlc://pause:4 --access=p2p_access "%s" :demux=dump';
// --------------------------------------- Получение пути AceStream плеера ----
string GetTsPlayerPath() {
return ExtractShortPathName(IncludeTrailingBackslash(RegistryRead('Software\\AceStream\\InstallDir')))+'Player\\ace_player.exe';
}
// ----------------------------------------------------------------------------
void GetTTVLink() {
string sData, sLink, sID = '';
if (HmsRegExMatch('acestream://(.*)', mpFilePath, sID)) {
HmsLogMessage(1, mpTitle+': Открываем по ID в ссылке');
} else if (HmsRegExMatch('/pid/.*?/stream.mp4', mpFilePath, '')) {
MediaResourceLink = mpFilePath;
} else if (HmsRegExMatch('^(.*acelive)$', mpFilePath, sID)) {
HmsLogMessage(1, mpTitle+': Открываем по файлу .acelive');
} else {
sData = HmsUtf8Decode(HmsDownloadURL(mpFilePath, '', true));
if (HmsRegExMatch('loadTorrent\\("(.*?)"', sData, sLink)) {
sID = HmsTempDirectory() + '\\' + mpTitle + '.acelive';
HmsDownloadURLToFile(sLink, sID);
HmsLogMessage(1, mpTitle+': Открываем по торрент файлу');
} else if (HmsRegExMatch('this.loadPlayer\\("(.*?)"', sData, sID)) {
HmsLogMessage(1, mpTitle+': Открываем по ID в загруженной странице');
} else {
//HmsLogMessage(2, mpTitle+': Ошибка! Не найден ID или ссылка на torrent файл.');
//return;
}
}
if (sID!='') MediaResourceLink = Format(csCommandLine, [GetTsPlayerPath(), sID]);
else MediaResourceLink = mpFilePath;
}
// ----------------------------------------------------------------------------
{
GetTTVLink();
}
551
C++Script
41
http://super-pomoyka.us.to/trash/ttv-list/ttv.all.player.m3u
43
video/mpeg
55
https://i.ytimg.com/vi/WYURfBRkQ8o/maxresdefault.jpg
42
2