Рылся по инету, нашёл интересную ссылку для форматирования исходного кода при вставке в блог:
http://formatmysourcecode.blogspot.com/
четвер, 28 січня 2010 р.
vsetv.com ;)
И всё же "я знаю кунг-фу!" ;)
Вначале надеялся, что Searches отрабатывают до парсинга, но оказалось — нет. Вначале разбирается шаблон, а затем уже отрабатывают Searches.
Отсюда родилась идея добавить небольшой код, который будет перемалывать входящий файл и приводить его в нужную структуру. Как я уже говорил, нынче vsetv.com отдаёт просто набор div-ов, и div-ы с описаниями могут или быть, или не быть, каждая запись никак не группируется (например родительский div, в котором есть и время + название, и опционально описание передачи).
Поэтому перед разбором шаблона этот код обрабатывает набор подстановок, которые приводят содержимое к одной и той же структуре — всегда подряд 3 div-а.
В результате имеем набор правил для обработки (точнее, ниже весь www_vsetv_com.xml):
Если кому интересно, вот патчик:
Либо свяжитесь, вышлю Utils.dll для релиза 1.0.2.
Вначале надеялся, что Searches отрабатывают до парсинга, но оказалось — нет. Вначале разбирается шаблон, а затем уже отрабатывают Searches.
Отсюда родилась идея добавить небольшой код, который будет перемалывать входящий файл и приводить его в нужную структуру. Как я уже говорил, нынче vsetv.com отдаёт просто набор div-ов, и div-ы с описаниями могут или быть, или не быть, каждая запись никак не группируется (например родительский div, в котором есть и время + название, и опционально описание передачи).
Поэтому перед разбором шаблона этот код обрабатывает набор подстановок, которые приводят содержимое к одной и той же структуре — всегда подряд 3 div-а.
В результате имеем набор правил для обработки (точнее, ниже весь www_vsetv_com.xml):
<?xml version="1.0" encoding="utf-8"?>
<Grabber>
<Info availableDays="7" timezone="E. Europe Standard Time" version="2.0" />
<Channels>
<Channel id="ort@www.vsetv.com" siteId="21" />
</Channels>
<Listing type="Html">
<Site url="http://www.vsetv.com/schedule_channel_[ID]_day_[YYYY]-[MM]-[DD]_print_wd.html" post="" external="false" encoding="" />
<Html>
<Template name="default" start="<div class="time"" end="</div><div class="clear">
<PreProcess>
<Subst match="</div><div id="schedule_container"[^>]*>" to="" />
<Subst match="(<div .*?class="prdesc">)(</div>)" to="$1<div class="desc">$2$2" />
<Subst match="(?<=.+)(?<!</div></div>)(<div class="time")" to="<div class="prdesc"><div class="desc"></div></div>$1" />
<Subst match="(?!<!</div></div>)$" to="<div class="prdesc"><div class="desc"></div></div>" />
<Subst match="<div class="desc">(.+?)</div>" to="$1" />
</PreProcess>
<SectionTemplate tags="D">
<TemplateText>
<div><#START></div>
<div><#TITLE></div>
<div><#DESCRIPTION></div>
</TemplateText>
</SectionTemplate>
</Template>
</Html>
</Listing>
</Grabber>
<!--
vim: enc=utf-8
-->
Если кому интересно, вот патчик:
diff -Nru Release 1.0.2.orig\MediaPortal\Utils\Utils.csproj Release 1.0.2\MediaPortal\Utils\Utils.csproj
--- Release 1.0.2.orig\MediaPortal\Utils\Utils.csproj Sat May 09 00:27:10 2009
+++ Release 1.0.2\MediaPortal\Utils\Utils.csproj Wed Jan 27 23:28:39 2010
@@ -174,6 +174,7 @@
<Compile Include="Web\http\IHttpAuthentication.cs" />
<Compile Include="Web\http\SiteStatistics.cs" />
<Compile Include="Web\Parser\HtmlSectionMatch.cs" />
+ <Compile Include="Web\Parser\HtmlSectionSubst.cs" />
<Compile Include="Web\Parser\HtmlSectionTemplate.cs" />
<Compile Include="Web\Parser\HtmlParserTemplate.cs" />
<Compile Include="Web\Parser\HtmlParser.cs" />
diff -Nru Release 1.0.2.orig\MediaPortal\Utils\Web\Parser\HtmlParser.cs Release 1.0.2\MediaPortal\Utils\Web\Parser\HtmlParser.cs
--- Release 1.0.2.orig\MediaPortal\Utils\Web\Parser\HtmlParser.cs Sat May 09 00:27:10 2009
+++ Release 1.0.2\MediaPortal\Utils\Web\Parser\HtmlParser.cs Thu Jan 28 12:06:07 2010
@@ -99,11 +99,22 @@
}
//log error?
}
+
+ if (startIndex != 0 || endIndex != pageSource.Length)
+ pageSource = pageSource.Substring(startIndex, endIndex - startIndex);
+
+ foreach (HtmlSectionSubst subst in _template.SubstList) {
+ RegexOptions opts = RegexOptions.None;
+ if (subst.ignoreCase)
+ opts |= RegexOptions.IgnoreCase;
+ Regex re = new Regex(subst.match, opts);
+ pageSource = re.Replace(pageSource, subst.to);
+ }
int count = 0;
if (pageSource != null)
{
- count = _profiler.MatchCount(pageSource.Substring(startIndex, endIndex - startIndex));
+ count = _profiler.MatchCount(pageSource);
}
return count;
diff -Nru Release 1.0.2.orig\MediaPortal\Utils\Web\Parser\HtmlParserTemplate.cs Release 1.0.2\MediaPortal\Utils\Web\Parser\HtmlParserTemplate.cs
--- Release 1.0.2.orig\MediaPortal\Utils\Web\Parser\HtmlParserTemplate.cs Sat May 09 00:27:10 2009
+++ Release 1.0.2\MediaPortal\Utils\Web\Parser\HtmlParserTemplate.cs Thu Jan 28 00:11:51 2010
@@ -24,6 +24,7 @@
#endregion
using System;
+using System.Collections.Generic;
using System.Xml.Serialization;
namespace MediaPortal.Utils.Web
@@ -39,6 +40,7 @@
[XmlAttribute("name")] public string Name;
[XmlAttribute("start")] public string Start;
[XmlAttribute("end")] public string End;
+ [XmlArray("PreProcess")] [XmlArrayItem("Subst")] public List<HtmlSectionSubst> SubstList;
[XmlElement("SectionTemplate")] public HtmlSectionTemplate SectionTemplate;
#endregion
diff -Nru Release 1.0.2.orig\MediaPortal\Utils\Web\Parser\HtmlSectionSubst.cs Release 1.0.2\MediaPortal\Utils\Web\Parser\HtmlSectionSubst.cs
--- Release 1.0.2.orig\MediaPortal\Utils\Web\Parser\HtmlSectionSubst.cs Thu Jan 01 02:00:00 1970
+++ Release 1.0.2\MediaPortal\Utils\Web\Parser\HtmlSectionSubst.cs Wed Jan 27 23:46:01 2010
@@ -0,0 +1,45 @@
+п»ї#region Copyright (C) 2005-2009 Team MediaPortal
+
+/*
+ * Copyright (C) 2005-2009 Team MediaPortal
+ * http://www.team-mediaportal.com
+ *
+ * This Program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This Program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Make; see the file COPYING. If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ */
+
+#endregion
+
+using System;
+using System.Xml.Serialization;
+
+namespace MediaPortal.Utils.Web
+{
+ /// <summary>
+ /// Xml Serializable Class for Section Subst data.
+ /// </summary>
+ [Serializable]
+ public class HtmlSectionSubst
+ {
+ #region Variables
+
+ [XmlAttribute("match")] public string match;
+ [XmlAttribute("to")] public string to;
+ [XmlAttribute("ignoreCase")] public bool ignoreCase;
+
+ #endregion
+ }
+}
Либо свяжитесь, вышлю Utils.dll для релиза 1.0.2.
середа, 27 січня 2010 р.
Samsung HD103SJ - вибрации
Решил я тут себе добавить свободы немножко (а то качать всякое уже некогда, а удалять всё подряд рука, как обычно, не поднимается).
Долго лазил по ixbt.com, читал-перечитывал — остановил выбор на Samsung HD103SJ. Ок, вроде по нему претензий нет (на SI жаловались на периодические вибрации).
Установил и... оп-па! Вибрирует, да ещё и как! Мало того, что просто вибрации сильные, так ещё и периодически усиливаются (период 1–2 секунды).
Сказать, что я был расстроен — ничего не сказать. Уже собирался напрягать людей насчёт замены.
Порылся в интернете и наткнулся на статью (жалко, картинки уже недоступны), решил попробовать.
Бинт Мартенса (цена вопроса 15грн или около того), немного возни (вначале одна из резинок порвалась, плюс немного проклеил стыки крышки и корпуса) и... тишина ;)
Долго лазил по ixbt.com, читал-перечитывал — остановил выбор на Samsung HD103SJ. Ок, вроде по нему претензий нет (на SI жаловались на периодические вибрации).
Установил и... оп-па! Вибрирует, да ещё и как! Мало того, что просто вибрации сильные, так ещё и периодически усиливаются (период 1–2 секунды).
Сказать, что я был расстроен — ничего не сказать. Уже собирался напрягать людей насчёт замены.
Порылся в интернете и наткнулся на статью (жалко, картинки уже недоступны), решил попробовать.
Бинт Мартенса (цена вопроса 15грн или около того), немного возни (вначале одна из резинок порвалась, плюс немного проклеил стыки крышки и корпуса) и... тишина ;)
пʼятниця, 15 січня 2010 р.
Inter+
Пропала у меня программа передач канала Inter+. Долго и добросовестно отдавал мне её tv.ukr.net. Начал проверять остальные сайты — аналогично! (такое впечатление, что, что у кого-то на праздниках поломался парсер).
Есть только на vsetv.com, но у них контент практически не парсится
Что делать?
Как вариант — написать прокси, который будет приводить содержимое в чувство.
Черт! Я знаю кунг-фу!
Буквально с разбегу удалось разобраться, как получить программу по конкретным датам на родном сайте (вместо .../Monday.html и т.п.), и результат довольно быстро засунул в WebEPG.
Аналогично довольно быстро получилось и с RTG TV (раньше я его с vsetv.com вытаскивал, но как я уже говорил, этот сайт нынче невозможно простыми силами разобрать).
Вуа-ля! ;)
Не, нифига не кунг-фу :(
Как выяснилось, по конкретным датам получить программу-то можно, но только в виде для печати, который разобрать совершенно невозможно.
Затем мне удалось подправить исходники WebEPG и добиться поддержки дней недели в нижнем регистре (monday.html), но последующий анализ показал, что моя привязка к тегу <a>..</a> не подходит:
Как видно, часть передач не обёрнута в <a>..</a> и соответственно просто теряются (WebEPG не поддерживает <br />).
Единственный выход я вижу — добиться результатов от vsetv.com
Есть только на vsetv.com, но у них контент практически не парсится
Что делать?
Как вариант — написать прокси, который будет приводить содержимое в чувство.
Черт! Я знаю кунг-фу!
Буквально с разбегу удалось разобраться, как получить программу по конкретным датам на родном сайте (вместо .../Monday.html и т.п.), и результат довольно быстро засунул в WebEPG.
Аналогично довольно быстро получилось и с RTG TV (раньше я его с vsetv.com вытаскивал, но как я уже говорил, этот сайт нынче невозможно простыми силами разобрать).
Вуа-ля! ;)
Не, нифига не кунг-фу :(
Как выяснилось, по конкретным датам получить программу-то можно, но только в виде для печати, который разобрать совершенно невозможно.
Затем мне удалось подправить исходники WebEPG и добиться поддержки дней недели в нижнем регистре (monday.html), но последующий анализ показал, что моя привязка к тегу <a>..</a> не подходит:
<a class=tvevening href=/ru/programs/vernisazh_illi_reznika/>18:15 Концерт "Песенный вернисаж Ильи Резника&"</a><br>
19:45 Ночь выборов<br>
Как видно, часть передач не обёрнута в <a>..</a> и соответственно просто теряются (WebEPG не поддерживает <br />).
Единственный выход я вижу — добиться результатов от vsetv.com
середа, 6 січня 2010 р.
Словарь Эллочки..
не, я про Даньку. Словарь потихоньку начинает пополняться.
Мама, папа, баба, дед (наконец-то) и даже дядя — это уже пройденный этап.
Нынче у нас после многократного просмотра "Ну, погоди!" появлось слово волк (точне - "воук") и шарик (произности как среднее между "карь" и "кари"), а кот определяется словом "мау".
Иногда мне хочется, чтоб Данька быстрее вырос, а потом я себя останавливаю тем, что Данька вырастет и таким, как сейчас — уже не будет! И не будет тех волнующих моментов, когда Данька осваивает какое-то новое слово. Это же классно! ;)
Мама, папа, баба, дед (наконец-то) и даже дядя — это уже пройденный этап.
Нынче у нас после многократного просмотра "Ну, погоди!" появлось слово волк (точне - "воук") и шарик (произности как среднее между "карь" и "кари"), а кот определяется словом "мау".
Иногда мне хочется, чтоб Данька быстрее вырос, а потом я себя останавливаю тем, что Данька вырастет и таким, как сейчас — уже не будет! И не будет тех волнующих моментов, когда Данька осваивает какое-то новое слово. Это же классно! ;)
Всё бывает в первый раз..
и с машиной тоже ;) Итак, впервые за 3,5 года:
- проколол ДВА колеса по левой стороне (интервал - несколько дней)
- залез в снег и не смог выехать
- и соответственно впервые воспользовался лопаткой (а то всё лежит и лежит в багажнике)
- проколол ДВА колеса по левой стороне (интервал - несколько дней)
- залез в снег и не смог выехать
- и соответственно впервые воспользовался лопаткой (а то всё лежит и лежит в багажнике)
Підписатися на:
Дописи (Atom)