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

Интернет-телевидение, интернет-радио, подкасты, IPTV
linkey
Posts: 110
Joined: Mon Oct 10, 2011 5:45 pm

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

Post by linkey »

полурабочий подкаст про футбол http://futbik.net/
На сайте видео с разных ресурсов, а побороть рутуб и дейлимоушен нормально не смог (рутуб пока ваще не смог). Подкаст основан на savefrom.net (написанный как то давно WendyH)
Вообщем матчи смотреть можно, телепередач практически нету (они все на рутубе) Пока выкладываю так.
Может кто что подскажет WH ;-) Пробовал применить HDS, но что то у меня не срослось.
Ps обновляем один раз, потом вроде все само.
Attachments
fytbik.rar
(4.35 KiB) Downloaded 1790 times
samsung UE32D5000
WendyH
Posts: 393
Joined: Fri Apr 13, 2012 7:59 pm

Dailymotion

Post 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++, в паскале они должны быть одинарными. Особенно это касается регулярок. Постоянно на этом спотыкался и не мог понять почему не наботает.
SONY KDL-32CX520
WendyH
Posts: 393
Joined: Fri Apr 13, 2012 7:59 pm

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

Post by WendyH »

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

Суть проблемы: не подгружает список видео. Ошибок в логе нет. Остальные каналы работают нормально.
Сейчас на работе и с ходу не понял, в каком подкасте то? А то их же несколько вариантов.
SONY KDL-32CX520
WendyH
Posts: 393
Joined: Fri Apr 13, 2012 7:59 pm

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

Post 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)".
SONY KDL-32CX520
mch
Posts: 235
Joined: Wed Nov 02, 2011 2:01 pm

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

Post 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. Такое во всех трех вариантах ютуба
SAMSUNG UE32D5000 - Samsung_led_D-Series_2011_dlna_16x9_1920x1080_Peremotka.cfg & Samsung_led5000_dlna_16x9_1920x1080.cfg
indiboy
Posts: 18
Joined: Mon Dec 20, 2010 1:09 pm

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

Post by indiboy »

Подскажите пожалуйста подкасты на HD фильмы.
Спасибо.
Cattomcat
Posts: 1
Joined: Sat Feb 08, 2014 7:21 pm

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

Post by Cattomcat »

Подкаст Banan TV.
Сделал правильный рабочий набор скриптов, без навалов закомментированного и неиспользуемого кода. Можно использовать для изучения работы.
Для установки перетащите файл из папки в HMS..., ну как обычно. В Каналах по категориям выполните Создать ленты подкастов, и можно приступать к Обновлению подкастов (довольно долго! 2-5мин). В скриптах комментированы команды вывода в лог - их можно раскомментировать для наблюдения за процессом.
Банановый набор интересен с точки зрения разработки - несколько источников, разные источники - аселивные ссылки и ссылки на фреймы плееров. Вроде бы все работает.
Можно создать свой элемент в этом подкасте (Добавит подкаст) и в его таблицу руками натаскать ссылок - типа избранное - полезно для изучения работы.
И еще, кто подскажет что делает HmsShowInformation(mpTitle); HmsHideInformation; , вроде как нигде ничего не появляется и не исчезает?
Attachments
Banan.rar
(3.78 KiB) Downloaded 3156 times
WendyH
Posts: 393
Joined: Fri Apr 13, 2012 7:59 pm

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

Post by WendyH »

Cattomcat wrote:И еще, кто подскажет что делает HmsShowInformation(mpTitle); HmsHideInformation; , вроде как нигде ничего не появляется и не исчезает?
Не уверен, но по-моему она deprecated (устарела и не используется). В какой-то версии её сменила HmsShowProgress/HmsHideProgress. Помню она работала на старых версиях HMS. Или это глюк.
P.S.: Приятно смотреть на простой и хорошо читабельный код подкаста. К сожалению, у меня редко так получается. ) Пишите ещё.
SONY KDL-32CX520
WendyH
Posts: 393
Joined: Fri Apr 13, 2012 7:59 pm

sochi2014.vesti.ru

Post by WendyH »

Видео событий и репортажей с vesti.ru заданной темы
или "как легко и просто получить ссылку на видео поток с vesti.ru".
Подозреваю, что работает только на последних версиях HMS. (ибо ffmpeg не всегда поддерживал плейлисты фрагментированного потока m3u8)
SONY KDL-32CX520
WendyH
Posts: 393
Joined: Fri Apr 13, 2012 7:59 pm

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

Post by WendyH »

Я, как всегда, прослоупочил. Посмотри я раньше у Евгения в youtube2, знал бы давно, что ссылку m3u8 плейлиста на фрагментированный поток (которые HLS, Apple HTTP Live Streaming) вообще можно в переменную MediaResourceLink как есть положить, только с пробелом в начале. (это я всё о том как легко и просто получать ссылки, подобные как на rutv.ru) Пример.
SONY KDL-32CX520
Post Reply