Page 51 of 52

Re: Коллекция подкастов

Posted: Thu Apr 25, 2013 10:31 pm
by linkey
полурабочий подкаст про футбол http://futbik.net/
На сайте видео с разных ресурсов, а побороть рутуб и дейлимоушен нормально не смог (рутуб пока ваще не смог). Подкаст основан на savefrom.net (написанный как то давно WendyH)
Вообщем матчи смотреть можно, телепередач практически нету (они все на рутубе) Пока выкладываю так.
Может кто что подскажет WH ;-) Пробовал применить HDS, но что то у меня не срослось.
Ps обновляем один раз, потом вроде все само.

Dailymotion

Posted: Sat Apr 27, 2013 10:48 pm
by WendyH
Посмотрел Dailymotion.com и сделал подкаст. Он очень простой и на нём даже учиться можно. Но он на C++ Script. И для получения ссылки с Dailymotion низкого и среднего качества на mp4 формат - там не много действий нужно.
Но вот качество выше, 720 и 1024 - уже только в формате фрагментированного потока. Типа как HDS. Только манифест структуру имеет другую и, кстати, мне кажется всё намного проще даже. Манифест mnft в json формате, с шаблонами ссылок частей. Пока незнаю чьё изобретение, но думаю реализовать поддержку этого дела всё в том же hdsdump.exe. Тем более что я его недавно дописывал для поддержки ссылок API Megogo, заодно и это туда запилю.

А по поводу rutube, у меня была написана функция получения ссылки.
[+] Вот на С++ Script, но если постараться можно на паскаль перевести.

Code: Select all

// ------------------ Универсальная функция подготовки к приёму потока HDS ----
char PrepareHDSLink(char sManifest, char sReferer='') {
  char sHtml, sVideoId, sBitrates, sBitrate, sIndex, sHeight, sDuration, sAvaliable, sSelectedHeight, sSelectedBitr='', sTime;
  int i, nCount, iHeight, iPriority, iMinPriority=99;
  bool bManifestDownloaded = false;

  char sTranscodingParams = '--manifest "'+sManifest+'"';
  if (sReferer!='') sTranscodingParams += ' --referer "'+sReferer+'"';

  if (HmsRegExMatch('--quality=(\\w+)', PodcastItem.ItemParent[mpiComment], sSelectedBitr)) sTranscodingParams += ' --quality '+sSelectedBitr;

  // Если включена приоритетность форматов видео - смотрим список битрейтов, и НЕ берём инденкс media (спасибо tarzann5!)
  if (mpPodcastMediaFormats != '') {
    sSelectedHeight = ''; sAvaliable='Доступно качество (высота кадра): '; sVideoId='';
    // Смотрим в манифест и вытаскиваем значение битрейта по выбранной высоте кадра
    sHtml = LoadUrl(sManifest);
    bManifestDownloaded = true;
    TRegExpr re = TRegExpr.Create('(<media.*?>)', 1);
    if (re.Search(sHtml)) do {
      HmsRegExMatch('height="(.*?)"',  re.Match, sHeight );
      HmsRegExMatch('bitrate="(.*?)"', re.Match, sBitrate);
      iHeight = StrToIntDef(sHeight, 0);
      iPriority = HmsMediaFormatPriority(iHeight, mpPodcastMediaFormats);
      if ((iPriority>=0)&&(iPriority<iMinPriority)) {iMinPriority=iPriority; sSelectedHeight=sHeight; sSelectedBitr=sBitrate;}
      sAvaliable += sBitrate+' ('+sHeight+'), ';
    } while (re.SearchAgain);
    re.Free();
    sAvaliable = LeftCopy(sAvaliable, Length(sAvaliable)-2); // Избавляемся от последней зяпятой

    if (HmsRegExMatch('--quality=(\\w+)', PodcastItem.ItemParent[mpiComment], sSelectedBitr)) {
      sAvaliable += '. Установлено параметром: '+sSelectedBitr;
    } else {
      sAvaliable += '. Выбрано: '+sSelectedBitr+' ('+sSelectedHeight+')';
      if (sSelectedBitr == '') HmsLogMessage(1, 'HDSDUMP: В манифесте не указана высота кадра, выбор качества только через параметр --quality=');
      else sTranscodingParams += ' --quality '+sSelectedBitr;
    }
    if (gbQualityLog) HmsLogMessage(1, mpTitle+': '+sAvaliable);
  }
  // Если не установлена длительность - уточняем из манифеста
  if ((Trim(PodcastItem[mpiTimeLength])=='')||(PodcastItem[mpiTimeLength]=='01:40:00.000')) {
    if (!bManifestDownloaded) sHtml = LoadUrl(sManifest);
    if (HmsRegExMatch('<duration>(\\d+).*?</duration>', sHtml, sDuration)) {
      sTime = HmsTimeFormat(StrToIntDef(sDuration, 6000));
      if (sTime != '') PodcastItem[mpiTimeLength] = sTime+'.000';
    }
  }
  PodcastItem[mpiTranscodingParams ] = sTranscodingParams;
  //PodcastItem[mpiTranscodingProfile] = 'Фильмы - HDS (ремуксирование)';
  if (mpTimeStart != '') sTranscodingParams = sTranscodingParams + ' --skip ' + mpTimeStart;
  return 'cmd://"' + ProgramPath + '\\Transcoders\\HdsDump.Exe" ' + sTranscodingParams + ' --play >"<OUTPUT FILE>"';
}
// ------------------------------------------ Получение ссылки с rutube.ru ----
bool GetLink_RuTube(char sLink) {
  char sHtml, sVideoId, sBaseUrl, sApp, sPlaypath;

  if (LeftCopy(sLink, 4)!='http') sLink = 'http://' + Trim(sLink);
  if (HmsRegExMatch('rutube.ru/video/\\w+', sLink, sVideoId)) {
    sHtml = LoadUrl(sLink);
    HmsRegExMatch('(video.rutube.ru/[\\d]+)', sHtml, sLink);
  }
  if (!HmsRegExMatch('video.rutube.ru/([\\d]+)', sLink, sVideoId))
  if (!HmsRegExMatch('rutube.ru/tracks/([\\d]+)', sLink, sVideoId))
  if (!HmsRegExMatch('rutube.ru/.*?track_id=([\\d]+)', sLink, sVideoId))
  if (!HmsRegExMatch('rutube.ru/compat/tracks/([\\d]+)', sLink, sVideoId)) return true;
  sLink = Format('http://rutube.ru/api/play/trackinfo/%s/?_=%g&format=json&referer=%s', [sVideoId, Random, HmsHttpEncode(sLink)]);
  sHtml = LoadUrl(sLink);
  if (!HmsRegExMatch('"video_balancer".*?"([^"]+f4m)"', sHtml, sLink)) {HmsLogMessage(2, mpTitle+' Не могу найти ссылку на манифест по ссылке '+sLink); return true;}
  sHtml = LoadUrl(sLink);
  // И смотрим, если в baseURL протокол rtmp - то наша ссылка будет представлять команду с rtmpdump.exe...
  if (HmsRegExMatch2('<baseURL>(rtmp://.*?/)(.*?)</baseURL>', sHtml, sBaseUrl, sApp)) {
    // rtmp
    if (!HmsRegExMatch('<media url="(.*?)"', sHtml, sPlaypath)) {HmsLogMessage(2, mpTitle+' Не могу найти Playpath по ссылке '+sLink); return true;}
    if (Pos('.f4f', sPlaypath)>0) {HmsLogMessage(2, mpTitle+' Шифрованный поток не умеем показывать.'); return true;}
    if (RightCopy(sApp, 1)!='/') sApp+='/';
    sPlaypath = HmsHtmlDecode(sPlaypath);
    if (LeftCopy(sPlaypath, 1)=='/') sPlaypath=Copy(sPlaypath, 2, Length(sPlaypath)-1);
    sLink = 'rtmpdump.exe --swfUrl "http://rutube.ru/player.swf" -r "'+sBaseUrl+'" --app "'+sApp+'" --playpath "'+sPlaypath+'"';
    if (sApp=='vod/') sLink+= ' --live';
    // HmsLogMessage(1, mpTitle+': Это rtmp!');
  } else if (HmsRegExMatch('<baseURL>(.*?)</baseURL>', sHtml, sBaseUrl)) {
    // Если есть тег media да и ещё с ссылкой на манифест, то это, должно быть, HDS
    if (HmsRegExMatch('<media[^>]+href="(.*?.f4m)"', sHtml, sPlaypath)) {
      sLink = sPlaypath;
      if (LeftCopy(sLink, 1)=='/') sLink = sBaseUrl + Trim(sLink);
    } else if (HmsRegExMatch('<media[^>]+url="(.*?)"', sHtml, sPlaypath)) {
      // Значит sLink уже ссылка на манифест - ничего не делаем
    } else {HmsLogMessage(2, mpTitle+' Не умею обрабатывать ссылку rutube '+sLink); return true;}
    // Указываем использования конкретного профиля
    PodcastItem[mpiTranscodingProfile] = 'Фильмы - HDS (ремуксирование)';
    MediaResourceLink = PrepareHDSLink(sLink);
    //HmsLogMessage(1, mpTitle+' Это HDSdump!');
  } else {
    HmsLogMessage(2, mpTitle+' Не могу найти BaseUrl по ссылке '+sLink);
  }
  MediaResourceLink = sLink;
  return true;
}
Там вторая функция PrepareHDSLink чисто работает с манифестом, определяясь с качеством и прочими общими делами, так что она какбы универсальная и не относится напрямую к rutube, а просто к работе с HDS.

Вот. А вообще, что стеснятся, спрашивайте, я ж могу ответить. Тем более столько ресурсов перепахал, и теми, которыми и не пользуюсь. Что зря знаниям пропадать.

P.S.
При переводе на паскаль, будьте внимательны с двойными в слешами в C++, в паскале они должны быть одинарными. Особенно это касается регулярок. Постоянно на этом спотыкался и не мог понять почему не наботает.

Re: Коллекция подкастов

Posted: Fri May 24, 2013 6:14 am
by WendyH
bartwell wrote:WendyH, почему-то youtube перестал показывать один канал: http://gdata.youtube.com/feeds/api/vide ... cy=include. Не могли бы вы поправить его? :oops:

Суть проблемы: не подгружает список видео. Ошибок в логе нет. Остальные каналы работают нормально.
Сейчас на работе и с ходу не понял, в каком подкасте то? А то их же несколько вариантов.

Re: Коллекция подкастов

Posted: Fri May 24, 2013 8:52 am
by WendyH
Всё дело в специфических символах в названиях. Открыв в браузере эту ссылку это можно увидеть. И функция HmsUtf8Decode на весь загруженный XML, видимо встречая невалидные символы UTF8, возвращает пустую строку. Вот переписанный немного скрипт, где для более безопасной работы с текстом эта функция вызывается для конкретных значений - названия, описания.
[+] Скрипт

Code: Select all

var
  gnItemsAdded: Integer;
  sXml, sItemBlock, sTitle, sLink, sTime, sDescr, sAuth, sImg, sGenre, sYear: string;
  Item: THmsScriptMediaItem; reSearch: TRegExpr;
// ----------------------------------------------------------------------------
// Main program
begin

  gnItemsAdded := 0;
  FolderItem.DeleteChildItems();                    // Удаляем старый список ссылок
  sXml := HmsDownloadURL(mpFilePath);

  // Создаём объект класса TRegExpr, который будет искать по регулярному выражению
  // Ищем блоки текста между тегами <item> и </item>
  reSearch := TRegExpr.Create('<item>(.*?)</item>', PCRE_SINGLELINE);
  if reSearch.Search(sXml) then repeat begin
    sItemBlock := reSearch.Match(); // Найденный блок

    // Поиск информации о видео
    HmsRegExMatch('<link>(.*?)&',                     sItemBlock, sLink ); // Ссылка
    HmsRegExMatch('<title>(.*?)</title>',             sItemBlock, sTitle); // Название
    HmsRegExMatch("thumbnail url='(.*?)'",            sItemBlock, sImg  ); // Картинка
    HmsRegExMatch('<description>(.*?)</description>', sItemBlock, sDescr); // Комментарий
    HmsRegExMatch("category label='(.*?)'",           sItemBlock, sGenre); // Категория / Жанр
    HmsRegExMatch("duration='(\d+)",                  sItemBlock, sTime ); // Длительность
    HmsRegExMatch('<author>(.*?)</author>',           sItemBlock, sAuth ); // Автор
    HmsRegExMatch('<pubDate>.*?(\d{4})',              sItemBlock, sYear ); // Год

    sTime := HmsTimeFormat(StrToIntDef(sTime, 6000))+'.000'; // Длительность приводим к формату HMS
    sGenre:= HmsUtf8Decode(HmsHtmlToText(sGenre));
    sDescr:= HmsUtf8Decode(HmsHtmlToText(sDescr));
    sAuth := HmsUtf8Decode(HmsHtmlToText(sAuth ));
    sTitle:= HmsUtf8Decode(HmsHtmlToText(sTitle));
    sTitle:= ReplaceStr(sTitle, '/', '-');  // Для телеков Samsung
    
    // Создаём элемент подкаста - ссылку и устанавливаем ему значения
    Item := HmsCreateMediaItem(sLink, FolderItem.ItemID);
    Item[mpiTitle]      := sTitle;    // Название
    Item[mpiThumbnail]  := sImg;      // Картинка
    Item[mpiComment]    := sDescr;    // Комментарий
    Item[mpiYear]       := sYear;     // Год
    Item[mpiTimeLength] := sTime;     // Длительность
    Item[mpiGenre]      := sGenre;    // Жанр
    Item[mpiCreateDate] := DateTimeToStr(IncTime(Now, 0, -gnItemsAdded, 0, 0)); // (Для обратной сортировки)
    gnItemsAdded := gnItemsAdded + 1;

  end until not reSearch.SearchAgain(); // Повторяем поиск пока он удачен (SearchAgain() возвращает true)

end.
Ну и для кучи твой подкаст, там я скрипт засунул в папку "Favorites" и убрал скрипты у подчинённых подкастов. А для того, чтобы на некоторых подкастах в этой папке срабатывал этот скрипт, "Режим чтения списка ресурсов" выставить в значение "Специальный (скрипт)". Для тех подкастов, где нужно чтобы срабатывал встроенный RSS ридер выставить в значение "Стандартный (RSS)".

Re: Коллекция подкастов

Posted: Tue Jul 16, 2013 3:21 pm
by mch
На подкасте ютуба перестали работать некоторые видеоролики (а некоторые работают как и работали).
Для примера:
Orbital | Never - YouTube
http://www.youtube.com/watch?v=ktgznOFpXeY
Image

Orbital | Wonky | Official Video - YouTube
http://www.youtube.com/watch?v=Q9675nvyses
Image

P.S. Такое во всех трех вариантах ютуба

Re: Коллекция подкастов

Posted: Mon Aug 19, 2013 6:35 pm
by indiboy
Подскажите пожалуйста подкасты на HD фильмы.
Спасибо.

Re: Коллекция подкастов

Posted: Mon Feb 10, 2014 3:20 pm
by Cattomcat
Подкаст Banan TV.
Сделал правильный рабочий набор скриптов, без навалов закомментированного и неиспользуемого кода. Можно использовать для изучения работы.
Для установки перетащите файл из папки в HMS..., ну как обычно. В Каналах по категориям выполните Создать ленты подкастов, и можно приступать к Обновлению подкастов (довольно долго! 2-5мин). В скриптах комментированы команды вывода в лог - их можно раскомментировать для наблюдения за процессом.
Банановый набор интересен с точки зрения разработки - несколько источников, разные источники - аселивные ссылки и ссылки на фреймы плееров. Вроде бы все работает.
Можно создать свой элемент в этом подкасте (Добавит подкаст) и в его таблицу руками натаскать ссылок - типа избранное - полезно для изучения работы.
И еще, кто подскажет что делает HmsShowInformation(mpTitle); HmsHideInformation; , вроде как нигде ничего не появляется и не исчезает?

Re: Коллекция подкастов

Posted: Mon Feb 10, 2014 8:14 pm
by WendyH
Cattomcat wrote:И еще, кто подскажет что делает HmsShowInformation(mpTitle); HmsHideInformation; , вроде как нигде ничего не появляется и не исчезает?
Не уверен, но по-моему она deprecated (устарела и не используется). В какой-то версии её сменила HmsShowProgress/HmsHideProgress. Помню она работала на старых версиях HMS. Или это глюк.
P.S.: Приятно смотреть на простой и хорошо читабельный код подкаста. К сожалению, у меня редко так получается. ) Пишите ещё.

sochi2014.vesti.ru

Posted: Mon Feb 10, 2014 11:53 pm
by WendyH
Видео событий и репортажей с vesti.ru заданной темы
или "как легко и просто получить ссылку на видео поток с vesti.ru".
Подозреваю, что работает только на последних версиях HMS. (ибо ffmpeg не всегда поддерживал плейлисты фрагментированного потока m3u8)

Re: Коллекция подкастов

Posted: Wed Feb 12, 2014 7:32 pm
by WendyH
Я, как всегда, прослоупочил. Посмотри я раньше у Евгения в youtube2, знал бы давно, что ссылку m3u8 плейлиста на фрагментированный поток (которые HLS, Apple HTTP Live Streaming) вообще можно в переменную MediaResourceLink как есть положить, только с пробелом в начале. (это я всё о том как легко и просто получать ссылки, подобные как на rutv.ru) Пример.