1

Тема: Вместо DeleteChildItems удалять ссылки по условию

Leshiy71 пишет:

А можно ли вместо функции FolderItem.DeleteChildItems, которая удаляет все созданные ссылки, задать условие сверки с ранее созданными ссылками по их названиям. Т.Е. как я понял, элемент в подкасте создаётся на основании ссылки, где указывается его название и загружается скриншот. А задача такая, чтобы при добавлении новых ссылок, то чтобы удалялись старые ссылки названий которых нет в новом плейлисте, а которые совпадают по названиям, то чтобы сохранялись. Нужно придумать для подкаста Торрент ТВ (избран+фильмы) где удалена строчка FolderItem.DeleteChildItems и новые каналы  накладываются на старые и свойства файлов сохраняются. Но проблема, что остаются старые не рабочие каналы, которых уже нет в новом плейлисте.

Да без проблем. Главное, чтобы была ясна задача и что именно нужно сделать. Потом включить воображение и придумать новую функцию, которая бы делала то, что нам надо.

Но для начала главное понять, что нам необходимо сделать.
Если удалять нужно только те ссылки, названия которых нет в текущем наборе существующих, уже ранее созданных ссылок, то мы сначала должны загрузить все данные о новых ссылках, найти их там (перебрать) и удалять те, названий которых в текущем списке нет.

Посмотрел подкаст "Торрент ТВ (избран+фильмы)", там, в отличии от TTV Autoplaylist не загружается плейлист, а загружаются страницы сайта и там ищутся ссылки с названиями. Именно в том подкасте нужно так сделать?

И тут я задумался. Получается что нужно создавать либо список совпадений и потом только удалять все, которые не совпали по названиям или создать список существующих ссылок с их наименованиями в отдельной переменной , и при добавлении, если имя такое есть, то удалять из этого списка, а оставшийся в конце пройтись и удалить.
В любом случае, удалять нужно будет только в самом конце, после того как мы пройдёмся при нахождении и создании ссылок определим, какие именно у нас обновились, а  какие нет - значит устарели и их нужно удалить.

Хм, если включить фантазию, то можно просто составлять список имён созданных (обновлённых) ссылок при обновлении, а в конце пройтись в цикле все существующие ссылки и удалять все, имя которых не в списке.

Не, сейчас поэкспериментировал, сделал так.
Сначала все существующие ссылки помечаются на удаление (неиспользуемому свойству под номером 4001 присвоил значение):

  // Помечаем все созданные ранее ссылки для удаления
  For i := 0 to FolderItem.ChildCount-1 Do FolderItem.ChildItems[i].Properties[4001] := '1';

Потом, при создании ссылок, сначала пытаемся найти по наименованию и в ней обновляем всю информацию, а это свойство очищаю:

  // Пытаемся найти элемент по наименованию
  Item := FolderItem.FindItemByProperty(mpiTitle, sName);
  // Если не найден - создаём
  if Item = nil then Item := HmsCreateMediaItem(sLink, FolderItem.ItemID);
  // Обновляем всю информацию
  Item[mpiFilePath      ] := sLink;
  Item[mpiTitle         ] := sName;
  Item[mpiThumbnail     ] := sImg; 
  Item[mpiTimeLength    ] := '11:40:00.000'; // длинная длительность 
  Item[mpiInternetItem  ] := '1';
  Item[mpiDVDAspectRatio] := '16:9';
  Item[4001             ] := ''; // Снимаем пометку удаления

А уж в самом конце - обходим все и удаляем оставшиеся (не обновлённые и новые) помеченные элементы:

/////////////////////////////////////////////////////////////////////////////// 
Procedure DeleteOldLinks();
Var
  i: Integer; Item: THmsScriptMediaItem;
Begin
  For i := FolderItem.ChildCount-1 DownTo 0 Do Begin
    Item := FolderItem.ChildItems[i];
    If Item[4001] = '1' Then Item.Delete;
  End;
End;

Не знаю, то ли вам было нужно. Проверял так, добавлял левые ссылки вручную и портил ссылки у существующих. Обновлял и порченные ссылки восстанавливались, а добавленные левые удалялись.

Прикрепил подкаст, посмотрите.

Прикреплённые файлы сообщения

ТоррентТВ (избр+фильмы).hdf 174.8 kb, скачивалось 658 раз, начиная с 2015.08.18

Sony Bravia KDL-32CX523

2

Re: Вместо DeleteChildItems удалять ссылки по условию

Мудрёно придумано, сам так сразу не научишься. Точно или нет срабатывает, будет видно после добавления или удаления каналов на сайте.
Если не затруднит, то хорошо бы и ещё такую функцию добавить, чтобы при запуске канала, если в свойствах файла больше 1 звуковой дорожки, то чтобы всегда загружались заново свойства файла, потому что проблемы с каналами вещающими с 2 дорожками - в каждом фильме разные.

Может всё можно было и проще сделать, если бы я сразу обрисовал задачу, а именно : поскольку при обновлении раздела в этом подкасте, большинство каналов остаются те же самые, с теми же ссылками ( в TTV Autoplaylist все ссылки меняются), то задача чтобы одинаковые каналы не заменялись на новые, для сохранения уже загруженных свойств, а новые чтобы добавлялись, и чтобы старые не рабочие каналы удалялись.

LG 42LM640T
Профиль  Универсальный
Видишь суслика ? Нет ! И я нет ! А он есть !!!

3

Re: Вместо DeleteChildItems удалять ссылки по условию

А зачем такие сложности, кроме "спортивного интереса"?  :)
Выигрыша по производительности нет. Список грузится и парсится всегда полностью. Мало того, вместо очистки всех существующих подкастов и создания нового дерева, скрипт делает 2 прохода по ссылкам, так еще + проверяет наличие подкаста в дочках.

4

Re: Вместо DeleteChildItems удалять ссылки по условию

d1mas пишет:

А зачем такие сложности, кроме "спортивного интереса"?  :)

Да не, обычно тут при обновлении теряется информация о свойствах потока (количество каналов, размер кадра, кадров в секунду и проч), которые нужны для правильного отображения, например, соотношения сторон для некоторых профилей транскодирования.
И приходится либо в программе опять считывать свойства ссылок на видео или в транскодирование заходить потом.
Ну и спортивный интерес. По мне, так показать, что почти любая задача решаема. Может кто стесняется попробовать самому написать подкаст, думает что там всё сложно.

Leshiy71 пишет:

...чтобы одинаковые каналы не заменялись на новые, для сохранения уже загруженных свойств, а новые чтобы добавлялись, и чтобы старые не рабочие каналы удалялись.

Да теоретически, всё так и будет работать.

  // Пытаемся найти элемент по наименованию
  Item := FolderItem.FindItemByProperty(mpiTitle, sName);
  // Если не найден - создаём
  if Item = nil then Item := HmsCreateMediaItem(sLink, FolderItem.ItemID);

Т.е. новый канал не будет создаваться, если такой уже есть и, по идее, информация о считанных свойствах останется.

Leshiy71 пишет:

Если не затруднит, то хорошо бы и ещё такую функцию добавить, чтобы при запуске канала, если в свойствах файла больше 1 звуковой дорожки, то чтобы всегда загружались заново свойства файла, потому что проблемы с каналами вещающими с 2 дорожками - в каждом фильме разные.

По-хорошему, это нужно делать в профиле транскодирования, а не в скрипте подкаста.
А получать свойства файла каждый раз при запуске? Можно конечно там тоже замутить, в скрипте получения ссылки, при начале воспроизведения таких каналов, ставить флаг, что мы в режиме получения инфы, потом выполнить команду PodcastItem.RetrieveProperties, которая, кстати, вызывает и скрипт получения ссылки опять - получается что мы из скрипта вызываем тот же скрипт в котором находимся! Поэтому проверяем, если установлен флаг, то ничего такого не делаем, чтобы не зациклить вызовы. А после команды PodcastItem.RetrieveProperties флаг убирать. Но это мне всё не нравится. Не эстетично как-то.

Sony Bravia KDL-32CX523

5

Re: Вместо DeleteChildItems удалять ссылки по условию

WendyH пишет:
d1mas пишет:

А зачем такие сложности, кроме "спортивного интереса"?  :)

Интерес очень простой - при обновлении подкаста все свойства файлов каналов слетают, и при использовании профиля транскода " фильмы ремуксирование" заново грузятся свойства и телек зачастую запускает каналы только со 2 попытки, поскольку не дожидается.

Leshiy71 пишет:

Если не затруднит, то хорошо бы и ещё такую функцию добавить, чтобы при запуске канала, если в свойствах файла больше 1 звуковой дорожки, то чтобы всегда загружались заново свойства файла, потому что проблемы с каналами вещающими с 2 дорожками - в каждом фильме разные.

По-хорошему, это нужно делать в профиле транскодирования, а не в скрипте подкаста.

Точно, так даже лучше. Подскажите, чего надо дописать в профиль транскода.

LG 42LM640T
Профиль  Универсальный
Видишь суслика ? Нет ! И я нет ! А он есть !!!

6

Re: Вместо DeleteChildItems удалять ссылки по условию

Leshiy71 пишет:

Точно, так даже лучше. Подскажите, чего надо дописать в профиль транскода.

Где главная процедура начинается, в самое её начало:

  if HmsGetStreamCount > 2 then HmsRetrieveProperties; // Если видео+аудио дорожек больше двух - считываем свойства файла заново

или

  if HmsGetItemProperty(mpiAudioStreams) > 1 then HmsRetrieveProperties; // Если аудио дорожек больше одной - считываем свойства файла заново
Sony Bravia KDL-32CX523

7

Re: Вместо DeleteChildItems удалять ссылки по условию

WendyH пишет:
Leshiy71 пишет:

Точно, так даже лучше. Подскажите, чего надо дописать в профиль транскода.

Где главная процедура начинается, в самое её начало:

  if HmsGetStreamCount > 2 then HmsRetrieveProperties; // Если видео+аудио дорожек больше двух - считываем свойства файла заново

или

  if HmsGetItemProperty(mpiAudioStreams) > 1 then HmsRetrieveProperties; // Если аудио дорожек больше одной - считываем свойства файла заново

С профилем "AceStream ремуксирование" со 2 вариантом перестаёт работать профиль, HMS пишет сразу ошибку, с 1 вариантом профиль работает, но свойства не загружает. Может из-за того что две строчки рядом (местами менял)
begin
if HmsGetStreamCount = 0 then begin HmsRetrieveProperties;
if HmsGetStreamCount > 2 then HmsRetrieveProperties;

  end;
дорожки MP2 и AC3 (Кинопоказ HD-1,Кино премиум HD)

LG 42LM640T
Профиль  Универсальный
Видишь суслика ? Нет ! И я нет ! А он есть !!!

8

Re: Вместо DeleteChildItems удалять ссылки по условию

Leshiy71 пишет:

С профилем "AceStream ремуксирование" со 2 вариантом перестаёт работать профиль, HMS пишет сразу ошибку, с 1 вариантом профиль работает, но свойства не загружает. Может из-за того что две строчки рядом (местами менял)
begin
if HmsGetStreamCount = 0 then begin HmsRetrieveProperties;
if HmsGetStreamCount > 2 then HmsRetrieveProperties;

  end;
дорожки MP2 и AC3 (Кинопоказ HD-1,Кино премиум HD)

У меня HMS занят, пыжется сканирует и сохраняет лого каналов с сайта lyngsat-logo. сохранил 7900 файлов, это он до буквы 'o' дошел. Поэтому сейчас проверить не могу, но в приведённом коде стоит сначала строка

 if HmsGetStreamCount = 0 then begin HmsRetrieveProperties;
...
  end;

Это значит что по условию будет выполнятся не просто команда, а блок, начиная с begin, кончая end;
Короче, ставте самой первой командой, не ошибётесь. Т.е. перед всеми другими.
if HmsGetStreamCount > 2 then HmsRetrieveProperties;
а потом уже
if HmsGetStreamCount = 0 then begin HmsRetrieveProperties;
или  так и делали, местами меняли?
А со вторым вариантом что за ошибка, что пишет? Ну или я потом проверю сам.
Вы скажите, в каких профилях планируете это сделать?

Sony Bravia KDL-32CX523

9

Re: Вместо DeleteChildItems удалять ссылки по условию

WendyH
Похоже с профилем "AceStream ремуксирование" всё работает, благодарю. Вот правильно я догадался, что эти каналы то кажут то нет из-за смены звуковых дорожек. И сейчас такая же херня была : обновляю подкаст TTV AutoPlaylist, запускаю НТВ HD - он первый раз грузит свойства а второй запуск нет как и должен, запускаю Кинопремиум HD - он при каждом запуске загружает свойства как и должен, запускаю Кинопоказ HD-1 - не загружает свойства ни когда, хоть ты тресни, хотя в папке транскод у него 2 дорожки. Короче тут какая то проблема в том, что HMS запоминает свойства пока его не перезагрузишь, а в фильме на канале, после перезагрузки HMS, оказывается уже только 1 дорожка сейчас идёт. Такая блин мутная штука получается с этими дорожками - вот сейчас он запомнил для канала Кинопоказ HD-1 что там 1 дорожка и больше загружать свойства не будет, а через 2 часа пойдёт фильм с 2 дорожками и будет ли он запускаться или нет, хрен его знает.

Хотел ещё с вами решить проблему запуска видео с Rutube с профилем фильмы ремуксирование. Думал что может сделать такое условие, чтобы загружалась в свойства только одна видеодорожка, и может тогда бы заработало. Но хотел проверить и удалить из свойств файлов лишние видеодорожки, и оказывается такой прикол, что HMS их не умеет удалять.

LG 42LM640T
Профиль  Универсальный
Видишь суслика ? Нет ! И я нет ! А он есть !!!

10

Re: Вместо DeleteChildItems удалять ссылки по условию

WendyH
Приведённый пример в шапке для подкаста Торрент ТВ который на Pascal, а нужно сделать в TTV Autoplaylist который на С++.
Или помимо замены Begin и end на скобки ещё есть разница в синтаксисе, или не туда вставляю, или вообще для этого подкаста надо по другому всё делать, в общем не получается добавить это условие в TTV Autoplaylist.

LG 42LM640T
Профиль  Универсальный
Видишь суслика ? Нет ! И я нет ! А он есть !!!

11

Re: Вместо DeleteChildItems удалять ссылки по условию

Да, конечно, конструкции ключевых слов у них разные (всякие For, While, IF...).
Также, из-за того, что у нас тут ссылки дополнительно распихованы по папкам, то список не плоский и нужно обходы всех ссылок делать также по папками и их содержимому.

Вот те же участки кода на C++:
В самом начале главной процедуры, вместо FolderItem.DeleteChildItems(); перед LoadPlaylist();

  // Помечаем все созданные ранее ссылки для удаления
  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';
    }
  }

Т.к. в скрипте TTV Autoplaylist мест создания ссылок более одного, то и само создание ссылок лучше вынести в отдельную функцию и просто её вызывать одной командой.
Для этого, перед объявлением процедуры void LoadPlaylist() нужно вставить данную процедуру:

///////////////////////////////////////////////////////////////////////////////
// ---- Создание ссылки на канал ----------------------------------------------
void CreateLink(string sLink, string sName, string sGrp) {
  THmsScriptMediaItem Item = HmsCreateMediaItem(sLink, FolderItem.ItemID, sGrp);
  Item[mpiTitle    ] = Trim(sName);
  Item[mpiThumbnail] = 'http://wonky.lostcut.net/tvim/'+ru2Lat(sName)+'.png';
  gnTotal++;
}

А в процедуре LoadPlaylist строки

      sName = Trim(sName);

      Item = HmsCreateMediaItem(sLink, FolderItem.ItemID, sGrp);
      Item[mpiTitle] = sName;
      Item[mpiThumbnail] = 'http://wonky.lostcut.net/tvim/'+ru2Lat(sName)+'.png';
      gnTotal++;

заменить на вызов одной командой:

      CreateLink(sLink, sName, sGrp);

А чуть ниже, блок:

        Item = HmsCreateMediaItem(sLink, FolderItem.ItemID, sGrp);
        Item[mpiTitle    ] = sName;
        Item[mpiThumbnail] = 'http://wonky.lostcut.net/tvim/'+ru2Lat(sName)+'.png';

тоже заменить на:

        CreateLink(sLink, sName, sGrp);

Тем самым мы вынесли логику создания ссылки в отдельную функцию, что нам даст немного удобств в дорабатывании этой логики для наших нужд.

Доработаем процедуру создания ссылки таким образом, чтобы она искала уже созданную такую ссылку.
Если находила или добавляла новую - то у такой ссылки очищаем флаг пометки на удаление.
В итоге наша процедура создания ссылки будет выглядеть так:

///////////////////////////////////////////////////////////////////////////////
// ---- Создание ссылки на канал с проверкой, не создана ли уже с таким именем
void CreateLink(string sLink, string sName, string sGrp) {
  THmsScriptMediaItem Item, Folder = FolderItem; // Folder - текущая папка
  
  sName = Trim(sName);

  // Если указана группа - находим сначала её и делаем текущей папкой
  if (sGrp!='') Folder = Folder.FindItemByProperty(mpiTitle, sGrp);
  
  // Пытаемся найти элемент по наименованию в папке Folder
  Item = Folder.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++;
}

Т.е. процедура стала немного больше. Но зато ничего не мешает там отдельно делать что хотеть, при создании ссылок.
Вообще, всё это можно организовать по-другому. Более правильно или наоборот, более эстетически. Например, поиск группы и элемента можно сделать такой конструкцией, но зато более воспринимающейся:

+ Да и вообще, как угодно можно делать, не принципиально
  // Пытаемся найти элемент по наименованию в папке 
  if (sGrp!='') 
    Item = FolderItem.FindItemByProperty(mpiTitle, sGrp).FindItemByProperty(mpiTitle, sName);
  else
    Item = FolderItem.FindItemByProperty(mpiTitle, sName);

Потом также добавляем процедуру удаления (теперь вы знаете что такое "Рекурсия" - вызов процедуры из самой этой процедуры):

///////////////////////////////////////////////////////////////////////////////
// ---- Рекурсивное удаление старых помеченных на удаление ссылок -------------
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();        // Иначе, если эта ссылка помечена на удаление - конец ей
  }
}

Ну и в самом конце, в главной процедуре, после команды LoadPlaylist(); вставляем вызов удаления всех ссылок помеченных для этого дела:

  // Удаляем помеченные для удаления ссылки начиная с текущей папки
  DeleteOldLinks(FolderItem); 

Как-то так.

Sony Bravia KDL-32CX523

12

Re: Вместо DeleteChildItems удалять ссылки по условию

Да, всё в этом языке программирования по другому, плохо когда азов не знаешь, а я пытался объединить русский язык с японским.
Сделал как в 1 варианте - проверка синтаксиса скрипта проходит нормально, а при выполнении скрипта по шагам выдаёт ошибку создания папок в строчке
} finally { RE.Free(); }

Прикреплённые файлы сообщения

TTV Auto pls + Izbr.hdf 10.41 kb, скачивалось 510 раз, начиная с 2016.01.10

LG 42LM640T
Профиль  Универсальный
Видишь суслика ? Нет ! И я нет ! А он есть !!!

13

Re: Вместо DeleteChildItems удалять ссылки по условию

Leshiy71, в выложенном вашем подкасте не обнаружил ошибку. Запускал в отладчике и всё проходило до конца без ошибок.
При вываливании на строке , где finally { RE.Free(); } что-то пишет в низу об ошибке? Если пишет, то что?

Вообще, блоки Try ... Finally нужны для того, чтобы при возникновении ошибки, обработать ситуацию.
В данном случае, создаётся объект RE

TRegExpr RE = TRegExpr.Create('#EXTINF:-?\\d?,?(.*?)[\\r\\n]([^\\r\\n]+)[\\r\\n$]', PCRE_SINGLELINE);

а потом идёт блок Try , в котором, если возникнет ошибка, то, как минимум после этого будет выполнен блок Finally - где объект RE освобождается от памяти.
Короче, если в программе вылетает на строке где блок Finally, то ошибка произошла в блоке Try. И там нужно смотреть.
Есть один и эффективный способ узнать что не так: пошаговая отладка. Нажимаете F8 и по шагам выполняете скрипт, и смотрите, на каком месте и после чего выйдет с ошибкой. Для того чтобы долго по шагам не выполнять кучу предварительных команд, можно поставить точку прерывания на интересующей строке и запустить скрипт (F9). Например, поставить точку остановки (F5) на строке TRegExpr RE = TRegExpr.Create(... и запустить скрипт (F9), а потом по шагам выполнять (F8) и смотреть чё происходит.

По поводу того, что вообще за код я тут вам даю и в чём заключается суть созданной темы.
Вот этапы, которые нужно выполнить:
1) Пометить на удаление все существующие ссылки на удаление
2) Запустить цикл создания (добавления) ссылок и всех созданных ссылок очистить флаг пометки удаления
3) В цикле удалить все ссылки, у которых осталась пометка на удаление.

У вас в скрипте не хватает третьего этапа.

Sony Bravia KDL-32CX523

14

Re: Вместо DeleteChildItems удалять ссылки по условию

Блин, я думаю, что такое? Мелькает иногда окошко. Пока не увидел в логах ссобщения об обновлении TTV Autoplaylist. Каждую минуту.
Оказывается, у вашего подкаста включена "Обновление списка медиа-ресурсов" и эта функция загружается вместе с подкастом в программу.

Кто успел загрузить - знайте, в свойствах подкаста нужно отключить.

Sony Bravia KDL-32CX523

15

Re: Вместо DeleteChildItems удалять ссылки по условию

WendyH пишет:

Блин, я думаю, что такое? Мелькает иногда окошко. Пока не увидел в логах ссобщения об обновлении TTV Autoplaylist. Каждую минуту.
Оказывается, у вашего подкаста включена "Обновление списка медиа-ресурсов" и эта функция загружается вместе с подкастом в программу.

Кто успел загрузить - знайте, в свойствах подкаста нужно отключить.

Да вроде отключено у меня обновление подкаста по расписанию, по крайней мере на том что экспериментирую сейчас.
Никак не пойму что за ошибка синтаксиса постоянно в строчке         ///////////////////////////////////////////////////////////////////////////////
// ---- Создание ссылки на канал с проверкой, не создана ли уже с таким именем
void CreateLink(string sLink, string sName, string sGrp) {
  THmsScriptMediaItem Item, Folder = FolderItem; // Folder - текущая папка
 
  sName = Trim(sName);
на функции CreateLink постоянно высвечивается что не хватает (;)
Вроде всё сделал по инструкции

Прикреплённые файлы сообщения

TTV Autoplaylist - test.hdf 12.06 kb, скачивалось 486 раз, начиная с 2016.01.11

LG 42LM640T
Профиль  Универсальный
Видишь суслика ? Нет ! И я нет ! А он есть !!!

16

Re: Вместо DeleteChildItems удалять ссылки по условию

Leshiy71 пишет:

на функции CreateLink постоянно высвечивается что не хватает (;)
Вроде всё сделал по инструкции

Редактор скриптов не понимает, как так началось объявление функции

void CreateLink(string sLink, string sName, string sGrp) {

когда как перед этим код явно не завершен.
Проблема в том, что до функции CreateLink.
У вас там во всю функция LoadPlaylist не завершена (не закрыта), да и ещё несколько блоков.
Да и вообще, функция CreateLink вставлена посреди кода функции LoadPlaylist. А она должна быть после.

P.S. Я специально не делаю код скрипта за вас. Нужно чтобы вы сами с ним разобрались. Иначе мои объяснения будут напрасны.
Посмотрел внимательно, там у вас ещё и функция DeleteOldLinks вставлена также посреди функции CreateLink и LoadPlaylist.
И ещё не удалена старая функция CreateLink выше. Такая функция должна быть только одна. Я выше говорил про переделку этой функции, т.е. замену одного кода на другой, более большой.

В общем,

+ вот этой функции вообще не должно быть
///////////////////////////////////////////////////////////////////////////////
// ---- Создание ссылки на канал ----------------------------------------------
void CreateLink(string sLink, string sName, string sGrp) {
  THmsScriptMediaItem Item = HmsCreateMediaItem(sLink, FolderItem.ItemID, sGrp);
  Item[mpiTitle    ] = Trim(sName);
  Item[mpiThumbnail] = 'http://wonky.lostcut.net/tvim/'+ru2Lat(sName)+'.png';
  gnTotal++;
}
+ должны подряд раздельно идти функции

Функция загрузки плейлиста и создания ссылок:

// ----------------------------------------------------------------------------
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();        // Иначе, если эта ссылка помечена на удаление - конец ей
  }
}

Заметье, вот так в C++Script открывается блок - {
А вот так закрывается - }

Поэтому сколько открытых фигурных скобок должно быть, столько и закрывающих. И новая функция должна идти после закрытия блока предыдущей функции.

Sony Bravia KDL-32CX523

17

Re: Вместо DeleteChildItems удалять ссылки по условию

Да я тоже сразу заподозрил, что создание ссылки на канал получились в двойном экземпляре, пробовал и удалять старую функцию, и вместо неё новую вписывать, по разному, но поскольку ошибок целый букет, то куда двигаться было не понятно. То что вместо Begin и End здесь значки { и } , тоже догадался, а вот с инфой о порядке блоков как вы выложили, стало намного понятнее. Но главная засада, это что подсказка выскакивает что ошибка синтаксиса (;), так я и думал что именно где то рядом не хватает точки с запятой. Если бы он мне подсказал что то более конкретное или бы вообще выдал сообщение что тут блоки местами перепутаны, или бы сказал что у вас тут сударь полная каша, было бы более понятно и я бы не искал где затёрлась точка с запятой.
Вобщем всё равно выдаёт ошибку синтаксиса на Load Playlist.

Прикреплённые файлы сообщения

TTV Autoplaylist - test 3.hdf 11.21 kb, скачивалось 498 раз, начиная с 2016.01.11

LG 42LM640T
Профиль  Универсальный
Видишь суслика ? Нет ! И я нет ! А он есть !!!

18

Re: Вместо DeleteChildItems удалять ссылки по условию

Он говорит, что пропущен знак {
Т.е. начало блока. У вас где-то потерялось начало главной процедуры.

+ Главная процедура выглядеть должна вот так
// ----------------------------------------------------------------------------
{
  // Помечаем все созданные ранее ссылки для удаления
  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);

}

А у вас сразу начинается команда

  LoadPlaylist();

Видимо, нечаянно удалили часть кода главной процедуры.

Sony Bravia KDL-32CX523

19

Re: Вместо DeleteChildItems удалять ссылки по условию

WendyH пишет:

Видимо, нечаянно удалили часть кода главной процедуры.

Честно сказать я этот блок удалил специально, поскольку почему то решил что он тоже в 2 вариантах получается как и создание ссылки на канал, а вот почему я так решил - мне самому интересно.
Ну кажись всё получилось, будем тестить.
Благодарю за науку !

LG 42LM640T
Профиль  Универсальный
Видишь суслика ? Нет ! И я нет ! А он есть !!!

20

Re: Вместо DeleteChildItems удалять ссылки по условию

Опять какие то чудеса с этим подкастом, вчера и сегодня всё работало, сохранил на диск, в HMS удалил, загружаю в HMS сохранённый подкаст и уже не работает, при запуске скрипта пишет ошибку
Ошибка выполнения: Object Item not found
Так и не понял в чём дело, проделал все нужные изменения со стандартным подкастом AutoPlaylist - всё работает, а когда сохраняю его и заного устанавливаю, то всё кранты.

Прикреплённые файлы сообщения

TTV Autoplaylist test 4.hdf 11.58 kb, скачивалось 519 раз, начиная с 2016.01.12

LG 42LM640T
Профиль  Универсальный
Видишь суслика ? Нет ! И я нет ! А он есть !!!

21

Re: Вместо DeleteChildItems удалять ссылки по условию

Непонятно, что именно вам не нравится. Скачал TTV Autoplaylist test 4.hdf, загрузил, работает. Не ругается.

Sony Bravia KDL-32CX523

22

Re: Вместо DeleteChildItems удалять ссылки по условию

WendyH пишет:

Непонятно, что именно вам не нравится. Скачал TTV Autoplaylist test 4.hdf, загрузил, работает. Не ругается.

А у меня даже папки не создаёт, а скрипт ругается. Возможно из-за того что я его сохранял закинув в корень подкаста избранные каналы из разделов и теперь HMS чего то не нравится.
Как нам это дело исправить ?

LG 42LM640T
Профиль  Универсальный
Видишь суслика ? Нет ! И я нет ! А он есть !!!

23

Re: Вместо DeleteChildItems удалять ссылки по условию

Попробовал и разобрался. Оказывается команды:

  if (sGrp!='') 
    Item = FolderItem.FindItemByProperty(mpiTitle, sGrp).FindItemByProperty(mpiTitle, sName);
  else
    Item = FolderItem.FindItemByProperty(mpiTitle, sName);

Могут крыть в себе угрозу. Item может быть не только nil, но и null. Просто я привык и толком ни разу не видел, чтобы значения приобретали значение null. А тут оказывается вон оно что.

Короче, чтобы исправить положение, достаточно строку:

  if (Item == nil) Item = HmsCreateMediaItem(sLink, FolderItem.ItemID, sGrp);

заменить на:

  if ((Item == nil) || (Item == null)) Item = HmsCreateMediaItem(sLink, FolderItem.ItemID, sGrp);
Sony Bravia KDL-32CX523
Спасибо сказали: Leshiy711

24

Re: Вместо DeleteChildItems удалять ссылки по условию

WendyH
Ну и чудеса творятся.
Оказывается ничего не работает чего мы тут напридумывали, т.е. при закидывании избранных каналов в корень подкаста и при изменении ссылок на сервере в плейлисте, при обновлении подкаста ссылки на каналах обновляются только в папках, а в корне избранные каналы не меняются.
Даже странно как я и другие люди им пользовались, когда избранные каналы перестают работать, а в папках показывают.
Уже около 1000 человек скачали и все молчат и всем нравится.
Жесть какая.

Прикреплённые файлы сообщения

TTV-VIP playlist.hdf 14.83 kb, скачивалось 477 раз, начиная с 2016.02.27

LG 42LM640T
Профиль  Универсальный
Видишь суслика ? Нет ! И я нет ! А он есть !!!

25

Re: Вместо DeleteChildItems удалять ссылки по условию

Leshiy71 пишет:

WendyH
Ну и чудеса творятся.
Оказывается ничего не работает чего мы тут напридумывали, т.е. при закидывании избранных каналов в корень подкаста и при изменении ссылок на сервере в плейлисте, при обновлении подкаста ссылки на каналах обновляются только в папках, а в корне избранные каналы не меняются.
Даже странно как я и другие люди им пользовались, когда избранные каналы перестают работать, а в папках показывают.
Уже около 1000 человек скачали и все молчат и всем нравится.
Жесть какая.

Да-да. Теперь и вы знаете это чувство.
Отчасти, так и появился этот форум. Потому как я тоже зависал с непонимающим выражением лица, когда узнавал, что одна из заявленных фич  или вообще весь подкаст  не работает как надо, а он уже пол года как выложен и около тыс скачиваний.
Или когда я подкаст Youtube выложил с сохранённым внутри ключом доступа именно к своему акку и скачавшие люди могли смотреть мои фото с googlephotos и проч. И только более чем через месяц и сотен скачиваний добрый человек мне написал письмо, что там такая фингя возможна была. Я тоже задавал вопросы - почему люди об этом молчат. И говорил "Жесть какая". И даже успел обидеться на Евгения и оф. форум, потому как считал, что из-за его политики до меня сообщения не доходят.
Однако, такое бывает. В общем, я брат той сестры, которая знает, что тут не всё так однозначно...


Короче, прикрепляю изменённый подкаст. Где все ссылки будут обрабатываться, и в корне, и во вложенных папках, даже в папках в папках и их подпапках.

Прикреплённые файлы сообщения

TTV-VIP_playlist_real.zip 5.06 kb, скачивалось 474 раза, начиная с 2016.02.28

Sony Bravia KDL-32CX523

26

Re: Вместо DeleteChildItems удалять ссылки по условию

WendyH
Какие то вы нам фокусы показываете.
Проверил как и раньше : ломаю ссылки на один и тот же канал в избранном и в папке - при обновлении подкаста так же как и раньше, в папке ссылка восстанавливается а в избранном нет, только раньше канал в избранном переставал работать, а сейчас показывает.
*THUMBSUP*

LG 42LM640T
Профиль  Универсальный
Видишь суслика ? Нет ! И я нет ! А он есть !!!

27

Re: Вместо DeleteChildItems удалять ссылки по условию

Leshiy71 пишет:

WendyH
Какие то вы нам фокусы показываете.
Проверил как и раньше : ломаю ссылки на один и тот же канал в избранном и в папке - при обновлении подкаста так же как и раньше, в папке ссылка восстанавливается а в избранном нет, только раньше канал в избранном переставал работать, а сейчас показывает.
*THUMBSUP*

Извините, если правильно понял, то сейчас в подкасте TTV-VIP playlist реализовано именно то о чём я спрашивал в этом сообщение? И, сейчас можно будет сварганить плейлист в котором ссылки будут "вечно живыми"?

LG 27MT75S-PZQ
Samsung HT-F4500

28

Re: Вместо DeleteChildItems удалять ссылки по условию

Voland пишет:

Извините, если правильно понял, то сейчас в подкасте TTV-VIP playlist реализовано именно то о чём я спрашивал в этом сообщение? И, сейчас можно будет сварганить плейлист в котором ссылки будут "вечно живыми"?

Да, теоретически. По крайней мере ID элементов, в котором обновлена ссылка, не будут меняться.

Sony Bravia KDL-32CX523

29

Re: Вместо DeleteChildItems удалять ссылки по условию

WendyH пишет:

Да, теоретически. По крайней мере ID элементов, в котором обновлена ссылка, не будут меняться.

Класс! Спасибо вам большое. *BRAVO*

Прикреплённые файлы сообщения

translate.txt 231.46 kb, скачивалось 254 раза, начиная с 2020.03.25

LG 27MT75S-PZQ
Samsung HT-F4500