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

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.

Немає коментарів:

Дописати коментар