Тема: Вместо DeleteChildItems удалять ссылки по условию
А можно ли вместо функции 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;
Не знаю, то ли вам было нужно. Проверял так, добавлял левые ссылки вручную и портил ссылки у существующих. Обновлял и порченные ссылки восстанавливались, а добавленные левые удалялись.
Прикрепил подкаст, посмотрите.