Czytnik RSS - MortScript + Homescreen++ UIPowiem krótko - zrobienie tego tak, żeby działało z każdym źródłem, dzisiaj jest już niemożliwością prawie... RSSy coraz mniej przypominają to, do czego zostały stworzone, niestety. Spora część z nich w treści zawiera całe strony HTMLowe, formatów samego pliku jest kilka, problem z kodowaniem...... ech.
Jeżeli jednak ktoś ma swoje ulubione źródło, a poniższy zestaw nie pracuje z nim poprawnie, dość łatwo można go sobie dopasować do swoich potrzeb.
Poniższy zestaw działa poprawnie na pewno z RSSem TVN24, który na dzień dzisiejszy ciągle jeszcze trzyma się standardów.
Jak to zainstalować w swoim temacie HS++?1. Po pierwsze, skrypt MS pobierający dane. RSSFeeds.mscr#
# RSS Feeds collector
# It collects given RSS feeds into the registry
# HKCU\Software\Headlines
#
# Author: Piotr 'utak3r' Borys
#
# The newest version can always be found at forum.mobione.pl
#
#
# USER SETTINGS
#
###################################################
# set the timer?
periodically = 1
# how often?
delayHours = 2
# RSS feeds URL
FeedsURL = "http://www.tvn24.pl/newsroom.xml"
#FeedsURL = "http://feeds.pocketpcthoughts.com/pocketpcthoughts"
# where's your MortScript.exe?
mort = "\Windows\MortScript.exe"
###################################################
#
# THE END OF USER SETTINGS
#
debug = 0
# ok, let's start....
if (debug = 1)
periodically = 0
Message("Starting...")
endif
GetTime(hour,min,sec,day,month,year)
if (periodically = 1)
utime = TimeStamp() + (delayHours*60)*60
script = """" & SystemPath("ScriptPath") & "\" & SystemPath("ScriptName") & SystemPath("ScriptExt") & """"
RemoveNotifications(mort, script)
RunAt( utime, mort, script)
endif
ErrorLevel("off")
# only bother if cellular radio is on
radio = RegRead("HKLM", "\System\State\Phone", "Cellular System Available")
if ((debug = 1) && (radio = 0))
Message("Radio is off!")
endif
if ((debug = 1) && (radio > 0))
Message("Radio is on :)")
endif
if (radio > 0)
# try to connect
if (not InternetConnected("http://www.google.com"))
Sleep(30000)
Connect("The Internet")
Sleep(10000)
endif
if (debug = 1)
Message("Downloading RSS feeds...")
endif
raw = ReadFile(FeedsURL)
if (debug = 1)
Message("Downloaded content: "&raw)
RegWriteString("HKCU", "\Software\Headlines\", "NewsRaw", raw)
endif
title = ""
content = ""
pubDate = ""
category = ""
url = ""
contentstart = 0
lp = 1
ForEach line in split(raw,"^LF^",1)
if (Find(line,"<item>"))
contentstart = 1
endif
if ((contentstart = 1) && (Find(line,"<title>")))
CallFunction("getTitle", title, line)
RegWriteString("HKCU", "\Software\Headlines\", "News"&lp, title)
endif
if ((contentstart = 1) && (Find(line,"<description>")))
CallFunction("getContent", content, line)
RegWriteString("HKCU", "\Software\Headlines\", "News"&lp&"Content", content)
endif
if ((contentstart = 1) && (Find(line,"<link>")))
CallFunction("getURL", url, line)
RegWriteString("HKCU", "\Software\Headlines\", "News"&lp&"URL", url)
endif
if ((contentstart = 1) && (Find(line,"<pubDate>")))
CallFunction("getPubDate", pubDate, line)
RegWriteString("HKCU", "\Software\Headlines\", "News"&lp&"PubDate", pubDate)
endif
if ((contentstart = 1) && (Find(line,"<category>")))
CallFunction("getCategory", category, line)
RegWriteString("HKCU", "\Software\Headlines\", "News"&lp&"Category", category)
lp = lp + 1
endif
EndForEach
if (debug = 1)
Message("Exiting script...")
endif
else
# we must be in a black hole
weather="W|0|No|Network"
if (debug = 1)
Message("WTF?! No network!...")
endif
endif
Sub getTitle
ttitlestart = find(argv[1], "<title>")
ttitleend = find(argv[1], "</title>", ttitlestart)
ttitle = SubStr(argv[1], ttitlestart+7, ttitleend-ttitlestart-7)
if (find(ttitle, "<![CDATA["))
ttitlestart = find(ttitle, "<![CDATA[")
ttitleend = find(ttitle, "]]>", ttitlestart)
ttitle = SubStr(ttitle, ttitlestart+9, ttitleend-ttitlestart-9)
endif
return(ttitle)
if (debug = 1)
Message(lp & ": Title: " & ttitle)
endif
EndSub
Sub getURL
turlstart = find(argv[1], "<link>")
turlend = find(argv[1], "</link>", turlstart)
turl = SubStr(argv[1], turlstart+6, turlend-turlstart-6)
return(turl)
if (debug = 1)
Message(lp & ": URL: " & turl)
endif
EndSub
Sub getContent
tvalstart = find(argv[1], "<description>")
tvalend = find(argv[1], "</description>", tvalstart)
tval = SubStr(argv[1], tvalstart+13, tvalend-tvalstart-13)
if (find(tval, "<![CDATA["))
tvalstart = find(tval, "<![CDATA[")
tvalend = find(tval, "]]>", tvalstart)
tval = SubStr(tval, tvalstart+9, tvalend-tvalstart-9)
endif
if (find(tval, "<img "))
tvalstart = find(tval, ">")
tval = SubStr(tval, tvalstart+1)
endif
return(tval)
if (debug = 1)
Message(lp & ": Content: " & tval)
endif
EndSub
Sub getPubDate
tvalstart = find(argv[1], "<pubDate>")
tvalend = find(argv[1], "</pubDate>", tvalstart)
tval = SubStr(argv[1], tvalstart+9, tvalend-tvalstart-9)
return(tval)
if (debug = 1)
Message(lp & ": PubDate: " & tval)
endif
EndSub
Sub getCategory
tvalstart = find(argv[1], "<category>")
tvalend = find(argv[1], "</category>", tvalstart)
tval = SubStr(argv[1], tvalstart+10, tvalend-tvalstart-10)
if (find(tval, "<![CDATA["))
tvalstart = find(tval, "<![CDATA[")
tvalend = find(tval, "]]>", tvalstart)
tval = SubStr(tval, tvalstart+9, tvalend-tvalstart-9)
endif
return(tval)
if (debug = 1)
Message(lp & ": Category: " & tval)
endif
EndSub
Na początku skryptu ustawiamy kilka parametrów działania:
periodically = 1/0Czy skrypt ma uruchamiać się automatycznie co jakiś czas?
delayHours = 2Jeżeli włączone automatyczne uruchamianie, co ile godzin skrypt ma pobierać dane?
FeedsURL = "http://www.tvn24.pl/newsroom.xml"Adres RSS
mort = "\Windows\MortScript.exe"Pełna ścieżka do interpretera MortScript.exe.
Jeżeli planujemy automatyczne uruchamianie skryptu, po jego skopiowaniu do wybranego katalogu, należy utworzyć link do niego w \Windows\StartUp, ewentualnie całego go tam skopiować.
2. Instalacja czytnika w wybranym temacie HS++.Dodajemy nowy rząd (zakładkę) w naszym temacie HS++:
<!-- 4 -->
<!--RSS Reader 8*) -->
<Row name="RSS Reader 8*)" seperator="0" rowtoggle="0" >
<View height="175" itemselect="1" adaptwidth="1" absolute="3" multi="1" >
<Item class="registry_tracker" ontap="StartApp" path="\Windows\MortScript.exe ::"\Program Files\HomeScreen PlusPlus\BSHome\RSSFeedsReader.mscr" lp=1 row=4 view=1">
<label text="%s" left="5" width="230" align="left" top="10" valign="top" format="wordbreak" fontsize="12" height="25" bold="1" fontfamily="Tahoma">
<registry key_value="HKCU\Software\Headlines\News1" />
</label>
</Item>
<Item class="registry_tracker" ontap="StartApp" path="\Windows\MortScript.exe ::"\Program Files\HomeScreen PlusPlus\BSHome\RSSFeedsReader.mscr" lp=2 row=4 view=1">
<label text="%s" left="5" width="230" align="left" top="45" valign="top" format="wordbreak" fontsize="12" height="25" bold="1" fontfamily="Tahoma">
<registry key_value="HKCU\Software\Headlines\News2" />
</label>
</Item>
<Item class="registry_tracker" ontap="StartApp" path="\Windows\MortScript.exe ::"\Program Files\HomeScreen PlusPlus\BSHome\RSSFeedsReader.mscr" lp=3 row=4 view=1">
<label text="%s" left="5" width="230" align="left" top="70" valign="top" format="wordbreak" fontsize="12" height="25" bold="1" fontfamily="Tahoma">
<registry key_value="HKCU\Software\Headlines\News3" />
</label>
</Item>
<Item class="registry_tracker" ontap="StartApp" path="\Windows\MortScript.exe ::"\Program Files\HomeScreen PlusPlus\BSHome\RSSFeedsReader.mscr" lp=4 row=4 view=1">
<label text="%s" left="5" width="230" align="left" top="105" valign="top" format="wordbreak" fontsize="12" height="25" bold="1" fontfamily="Tahoma">
<registry key_value="HKCU\Software\Headlines\News4" />
</label>
</Item>
<Item class="registry_tracker" ontap="StartApp" path="\Windows\MortScript.exe ::"\Program Files\HomeScreen PlusPlus\BSHome\RSSFeedsReader.mscr" lp=5 row=4 view=1">
<label text="%s" left="5" width="230" align="left" top="135" valign="top" format="wordbreak" fontsize="12" height="25" bold="1" fontfamily="Tahoma">
<registry key_value="HKCU\Software\Headlines\News5" />
</label>
</Item>
</View>
<View height="175" itemselect="1" adaptwidth="1" absolute="3" multi="1" >
<Item class="registry_tracker" ontap="View" index="4" subindex="0">
<label text="%s" left="5" width="230" align="left" top="10" valign="top" format="wordbreak" fontsize="12" height="25" bold="1" fontfamily="Tahoma">
<registry key_value="HKCU\Software\Headlines\News" />
</label>
</Item>
<Item class="registry_tracker" ontap="View" index="4" subindex="0">
<label text="%s" left="5" width="230" align="left" top="35" valign="top" format="wordbreak" fontsize="10" height="10" bold="0" fontfamily="Tahoma">
<registry key_value="HKCU\Software\Headlines\NewsPubDate" />
</label>
</Item>
<Item class="registry_tracker" ontap="View" index="4" subindex="0">
<label text="%s" left="175" width="60" align="right" top="35" valign="top" format="wordbreak" fontsize="10" height="10" bold="1" fontfamily="Tahoma">
<registry key_value="HKCU\Software\Headlines\NewsCategory" />
</label>
</Item>
<Item class="registry_tracker" ontap="View" index="4" subindex="0">
<label text="%s" left="5" width="230" align="left" top="50" valign="top" format="wordbreak" fontsize="12" height="130" bold="0" fontfamily="Tahoma">
<registry key_value="HKCU\Software\Headlines\NewsContent" />
</label>
</Item>
</View>
</Row>
Zakładka ta zawiera dwa widoki: widok nagłówków oraz widok treści.
W widoku nagłówków każdy element zawiera dwie istotne informacje:
<
Item class="
registry_tracker" ontap="
StartApp" path="
\Windows\MortScript.exe ::"\Program Files\HomeScreen PlusPlus\BSHome\RSSFeedsReader.mscr" lp=1 row=4 view=1">
Należy dopasować ścieżkę do interpretera MortScript, ścieżkę do skryptu, który za chwilę zainstalujemy oraz ustawić pożądany numer zakładki. W moim przykładzie całość wylądowała w zakładce o numerze
4, dlatego parametry wywołania skryptu wyglądają następująco:
lp=1 row=4 view=1gdzie:
lp - numer kolejny nagłówka
row - numer zakładki
view - tego
nie zmieniamy
oraz:
<registry key_value="HKCU\Software\Headlines\
News1" />
gdzie każdy kolejny nagłówek otrzymuje kolejny numer (News1, News2 itd.).
Na końcu w katalogu naszego tematu instalujemy kolejny skrypt MS, odpowiedzialny za wyświetlanie zawartości:
RSSFeedsReader.mscrtitle = RegRead("HKCU", "\Software\Headlines\", "News"&lp)
content = RegRead("HKCU", "\Software\Headlines\", "News"&lp&"Content")
pubDate = RegRead("HKCU", "\Software\Headlines\", "News"&lp&"PubDate")
category = RegRead("HKCU", "\Software\Headlines\", "News"&lp&"Category")
url = RegRead("HKCU", "\Software\Headlines\", "News"&lp&"URL")
RegWriteString("HKCU", "\Software\Headlines\", "News", title)
RegWriteString("HKCU", "\Software\Headlines\", "NewsContent", content)
RegWriteString("HKCU", "\Software\Headlines\", "NewsPubDate", pubDate)
RegWriteString("HKCU", "\Software\Headlines\", "NewsCategory", category)
RegWriteString("HKCU", "\Software\Headlines\", "NewsURL", url)
RegWriteString("HKLM", "\SOFTWARE\Microsoft\Today\Items\HomeScreen PlusPlus\", "Command", "100 "&row&" "&view)
W tym skrypcie nic nie trzeba ustawiać, wszystko, czego potrzebuje, otrzymuje jako parametry wywołania z poziomu HS++.
I.... chyba o niczym nie zapomniałem

Jakby były jakieś problemy, pytajcie.
Powodzenia!
