четвер, 28 січня 2010 р.

Форматирование исходного кода

Рылся по инету, нашёл интересную ссылку для форматирования исходного кода при вставке в блог:

http://formatmysourcecode.blogspot.com/

vsetv.com ;)

И всё же "я знаю кунг-фу!" ;)

Вначале надеялся, что 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="&lt;div class=&quot;time&quot;" end="&lt;/div&gt;&lt;div class=&quot;clear">
<PreProcess>
<Subst match="&lt;/div&gt;&lt;div id=&quot;schedule_container&quot;[^&gt;]*&gt;" to="" />
<Subst match="(&lt;div .*?class=&quot;prdesc&quot;&gt;)(&lt;/div&gt;)" to="$1&lt;div class=&quot;desc&quot;&gt;$2$2" />
<Subst match="(?&lt;=.+)(?&lt;!&lt;/div&gt;&lt;/div&gt;)(&lt;div class=&quot;time&quot;)" to="&lt;div class=&quot;prdesc&quot;&gt;&lt;div class=&quot;desc&quot;&gt;&lt;/div&gt;&lt;/div&gt;$1" />
<Subst match="(?!&lt;!&lt;/div&gt;&lt;/div&gt;)$" to="&lt;div class=&quot;prdesc&quot;&gt;&lt;div class=&quot;desc&quot;&gt;&lt;/div&gt;&lt;/div&gt;" />
<Subst match="&lt;div class=&quot;desc&quot;&gt;(.+?)&lt;/div&gt;" to="$1" />
</PreProcess>
<SectionTemplate tags="D">
<TemplateText>
&lt;div&gt;&lt;#START&gt;&lt;/div&gt;
&lt;div&gt;&lt;#TITLE&gt;&lt;/div&gt;
&lt;div&gt;&lt;#DESCRIPTION&gt;&lt;/div&gt;
</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грн или около того), немного возни (вначале одна из резинок порвалась, плюс немного проклеил стыки крышки и корпуса) и... тишина ;)

пʼятниця, 15 січня 2010 р.

Inter+

Пропала у меня программа передач канала Inter+. Долго и добросовестно отдавал мне её tv.ukr.net. Начал проверять остальные сайты — аналогично! (такое впечатление, что, что у кого-то на праздниках поломался парсер).

Есть только на 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&nbsp;Концерт &quot;Песенный вернисаж Ильи Резника&"</a><br>
19:45 Ночь выборов<br>


Как видно, часть передач не обёрнута в <a>..</a> и соответственно просто теряются (WebEPG не поддерживает <br />).

Единственный выход я вижу — добиться результатов от vsetv.com

середа, 6 січня 2010 р.

Словарь Эллочки..

не, я про Даньку. Словарь потихоньку начинает пополняться.
Мама, папа, баба, дед (наконец-то) и даже дядя — это уже пройденный этап.
Нынче у нас после многократного просмотра "Ну, погоди!" появлось слово волк (точне - "воук") и шарик (произности как среднее между "карь" и "кари"), а кот определяется словом "мау".

Иногда мне хочется, чтоб Данька быстрее вырос, а потом я себя останавливаю тем, что Данька вырастет и таким, как сейчас — уже не будет! И не будет тех волнующих моментов, когда Данька осваивает какое-то новое слово. Это же классно! ;)

Всё бывает в первый раз..

и с машиной тоже ;) Итак, впервые за 3,5 года:
- проколол ДВА колеса по левой стороне (интервал - несколько дней)
- залез в снег и не смог выехать
- и соответственно впервые воспользовался лопаткой (а то всё лежит и лежит в багажнике)