Ostatni artykuł z mikrocyklu o RSS. Podzielę się napisanym parę tygodni temu skryptem, którym pomagam sobie w zarządzaniu listą subskrypcji w Google Readerze. Może komuś przyda się w tej formie, może komuś jego kod posłuży jako punkt wyjścia przy pisaniu innego narzędzia. Skrypciku używam pod Linuksem ale powinien zadziałać i na innych systemach (pod warunkiem zainstalowania Pythona).
By artykuł nie był czysto techniczną notką, jeden z rozdziałów poświęcam jeszcze jednej metodzie robienia notatek i list rzeczy do zrobienia.
Funkcjonalność
Skrypcik greader2org
pozwala wyeksportować bieżącą listę subskrypcji
z Google Readera jako prosty (i - w przeciwieńswie do OPML - czytelny
dla człowieka) pliczek tekstowy. Umie również wgrać z powrotem efekty
jego edycji.
Tworzony plik wygląda tak (tu oczywiście fragment):
* Agregatory
** OSnews.pl
feed: http://feeds.feedburner.com/osnewspl_full
** Planeta Jakilinux
feed: http://feeds.feedburner.com/PlanetaJakilinux
** Slashdot
feed: http://rss.slashdot.org/Slashdot/slashdot
* Apps: Emacs
** emacs-fu
feed: http://emacs-fu.blogspot.com/feeds/posts/default
** M-x all-things-emacs
feed: http://www.emacsblog.org/feed/
Czemu taki akurat format, wyjaśnię za chwilę. Jak łatwo się domyślić mamy tu foldery, a w nich kanały RSS. Dla każdego kanału zapisany jest tytuł i adres (można też dodać pewne inne informacje).
Co można z tym zrobić? Pozmieniać nazwy (tak folderów, jak kanałów), przeorganizować hierarchię (poprzenosić kanały do innych folderów, stworzyć nowe foldery itp), oznaczyć wybrane kanały do czasowego wyłączenia, także nakazać przepuszczenie niektórych kanałów przez PostRank.
Oczywiście wszystkie te operacje można zrobić bezpośrednio w interfejsie Google Readera. Zaletą edycji jako tekstu jest możliwość robienia globalnego search&replace, łatwość kopiowania i przenoszenia bloków tekstu, funkcja undo itp.
Proces nie jest jednorazowy, można go wielokrotnie powtarzać (aktualizując zachowaną listę).
Dlaczego gwiazdeczki czyli dygresja o interesującym narzędziu
Taki a nie inny format (gwiazdeczki, wcięcia) pozwala bardzo wygodnie edytować powyższy pliczek przy pomocy emacsowego org-mode, w którym można zwijać/rozwijać poszczególne sekcje i wygodnymi skrótami klawiszowymi przenosić całe bloki.
Ewangelizacji Emacsem prowadzić nie będę, kilka osób to już robi (patrz np. cykl Emacs w odcinkach).
Używam tego edytora od bodaj piętnastu lat, znam może z ćwiartkę jego możliwości, regularnie go zdradzam z różnymi IDE i równie regularnie do niego wracam. Znalazłem nawet wersję sensownie działającą pod Windows (sympatyczny Emacs z Ctrl-X, Ctrl-C, Ctrl-V itp robiącymi to, czego ludzie zwykle oczekują).
Reszta tego rozdziału tylko dla użytkowników Emacsa, pozostali są proszeni o PgDown.
Samo org-mode odkryłem dwa miesięce temu i ... podoba mi się. Jest to bardzo poręczny tryb do pisania planów i konspektów, a także rozwijania ich w gotowe teksty. Przy jego pomocy powstało większość tegorocznych artykułów z mojego bloga (wcześniej nieraz rysowałem mind-mapy ale plany w org-mode pisze się równie wygodnie, a przejście od nich do finalnego tekstu jest bardziej naturalne).
Ba - org-mode może służyć także do utrzymywania list rzeczy do zrobienia. Testowałem to na razie tylko wstępnie ale sytuacja, w której z jednej strony mogę trzymać różne projektowe To-Do jako proste pliki tekstowe w katalogach projektu, a z drugiej mieć z tego zbiorcze raporty i przekroje - jest interesująca. Są nawet ludzie używający org-mode do GTD.
Moja minimalna hybryda obu powyższych zastosowań: w konspekcie artykułu oznaczam flagą TODO jeszcze nie napisane rozdziały, a flagą DONE te już gotowe, dzięki temu mogę je sobie wizualizować jako zadania.
Interesujący filmik prezentujący możliwości org-mode (w lepszej rozdzielczości do obejrzenia na YouTube):
Oczywiście, jak to zwykle w Emacsie, warto sobie wydrukować i przeczytać dokumentację.
Koniec dygresji, wracamy do tematu artykułu.
Instalacja skryptu
Potrzebny jest Python oraz biblioteki lxml i simplejson. Pod Ubuntu:
$ sudo apt-get install python lxml simplejson
Pod Windows/Mac ... też da się je zainstalować. Przy tym binarne (nie wymagające kompilacji) dystrybucje
lxml
isimplejson
istnieją, choć czasem trzeba użyć odrobinę starszej wersji.
Następnie albo instalujemy systemowo
$ sudo easy_install \ http://mekk.waw.pl/download/python/mekk.feeds-1.1.0-py2.5.egg
albo unikamy zaśmiecania systemowych katalogów używając wirtualne środowisko:
$ mkvirtualenv feeds $ easy_install \ http://mekk.waw.pl/download/python/mekk.feeds-1.1.0-py2.5.egg
Konfiguracja
Uruchamiamy:
$ greader2org
Efekt będzie następujący:
Program not yet configured! Edit the file /home/marcink/.feeds/feeds.ini using some text editor
Zarazem program stworzy katalog ~/.feeds
i wzorcowy plik feeds.ini
.
Do feeds.ini
trzeba wpisać nazwę i hasło do Google Readera.
Warto to uzupełnić zrobieniem:
$ chmod go-rwx ~/.feeds/feeds.ini
(a przy wyższym poziomie paranoi usunąć ten plik po użyciu, przenieść i zasymlinkować go do katalogu na zaszyfrowanej partycji albo w inny sposób zatroszczyć się o większe bezpieczeńswo hasła).
Pierwsze uruchomienie
Uruchamiamy:
$ greader2org init
Efektem będzie stworzenie inicjalnej wersji pliku ~/.feeds/feeds.txt
(pod Windows podobnie nazwanego pliku w katalogu danych użytkownika)
zawierającego listę wszystkich aktualnie zasubskrybowanych w Readerze
kanałów RSS.
Regularne uruchamianie
Typowy scenariusz reorganizacji subskrypcji obejmuje ściągnięcie aktualizacji, edycję w edytorze i wgranie z powrotem zmian.
Pobieranie aktualizacji z Google Readera
Zaktualizowane informacje o subskrypcjach w Google Readerze pobieramy robiąc:
$ greader2org get
Polecenie to:
-
dopisuje do
feeds.txt
wszystkie kanały, które są obecne w Readerze, a których nie ma wfeeds.txt
(tj. kanały zasubskrybowane w przeglądarce od czasu poprzedniej aktualizacji), -
flaguje etykietą
:disabled:
kanały, które są obecne wfeeds.txt
, a których nie ma w Readerze (tj. kanały, które zostały ostatnio odsubskrybowane w Readerze)
Różnica między
greader2org get
a skasowaniemfeeds.txt
i stworzeniem go na nowogreader2org init
: w tym pierwszym wypadku zostają zachowane komentarze, czasowo wyłączone kanały, informacje o filtrowaniu itp.
Edycja
Edytujemy plik w dowolnym edytorze tekstu (jak pisałem wyżej, szczególnie wygodnie będzie w Emacsie z org-mode).
Szczegółowy opis struktury pliku zamieszczam nieco dalej, typowe przydatne operacje edycyjne to:
- modyfikowanie nazw folderów,
- zmienianie tytułów kanałów,
- przenoszenie kanałów pomiędzy folderami (albo do nowych folderów),
- oznaczanie kanałów do czasowego wyłączenia (flaga
:disabled:
), - nakazywanie ponownego włączenia (usuwanie znacznika
:disabled:
), - modyfikacje flagi
level
(patrz opis użycia filtrów PostRank), - dopisywanie komentarzy.
Wgrywanie zmian do Google Readera
Uruchamiamy:
$ greader2org put
Polecenie porównuje feeds.txt
z aktualnymi subskrypcjami
i wykonuje następujące zmiany w konfiguracji Google Readera.
Zmiany w subskrypcjach:
- dodaje do Readera kanały obecne w
feeds.txt
, których w Readerze brakuje (najczęściej będą to kanały, które były przez jakiś czas:disabled:
), - usuwa (z Readera) feedy oznaczone w
feeds.txt
jako:disabled:
, - zmienia subskrypcje feedów, dla których włączono albo wyłączono filtrowanie PostRankiem albo zmieniono jego poziom (patrz dalej).
Zmiany w nazwach:
- zmienia nazwy kanałów wyświetlane przez Reader zgodnie z nazwami
wpisanymi w
feeds.txt
.
Zmiany w folderach:
- kanały przeniesione do innych folderów przetagowywuje zgodnie z nowym przydziałem,
- podobnie koryguje kanały należące do folderów, które zmieniły nazwę.
Struktura pliku feeds.txt
Przykład najprostszej wersji feeds.txt
cytowałem już wyżej.
Obejmuje nazwy folderów, nazwy kanałów i ich adresy.
Bardziej złożony przykład obejmujący inne dostępne znaczniki:
* Szachy: Forum
** Chess-Server.net Forum - All Forums :private:
feed: http://forum.chess-server.net/syndication.php?type=atom1.0
** ICCF Forum :private:disabled:
feed: http://iccf.com/forum/external.php?type=RSS2
comment: ogłoszenia ICCF, włączyć po starcie turniejów
* Programowanie: Web
** SitePoint.com
feed: http://www.sitepoint.com/recent.rdf
postrank_feed: http://feeds.postrank.com/d6e48cfa50dc7f1cb13e8df0ad93b4a6
level: good
Mamy tutaj specjalne znaczniki przy tytułach (tagi) oraz parametry kanałów.
Tagi mają następujące znaczenie:
-
:disabled:
kanał zablokowany (używam tego głównie, gdy chcę jakiś kanał na jakiś czas wyłączyć ale kiedyś do niego wrócić), zostanie odsubskrybowany w Readerze ale wystarczy usunąć ten tag, by został dodany z powrotem; -
:private:
kanał prywatny (w tej chwili oznacza, że kanał nie zostanie przepuszczony przez PostRank).
Parametry to:
feed:
- url (adres) kanału,postrank_feed:
- url (adres) kanału przy filtrowaniu przez PostRank (dopisywany automatycznie, patrz niżej),level:
- poziom filtrowania PostRankiem (może mieć wartośćbest
,great
,good
, alboall
), obecność tego pola powoduje przepuszczanie feedu przez PostRank,comment:
- dowolny komentarz, nie jest do niczego używany ale zostaje zachowany.
PostRank
O PostRanku pisałem trochę w artykule o RSS. Jest to serwis, który na bazie aktywności czytelników (linki, komentarze, twity, blipy, zakładki, kliknięcia) ocenia atrakcyjność artykułów - i pozwala filtrować treści (w szczególności, subskrybować tylko najciekawsze artykuły z jakiegoś bloga).
Stosuję go w dwóch wypadkach: dla hiperaktywnych kanałów generujących kilka postów dziennie (jako formę zmniejszenia tempa, tu zwykle filtruję na poziomie
Good
alboGreat
by trochę zmniejszyć wolumen) oraz dla kanałów, które przestają mi się podobać ale jeszcze nie zdecydowałem się ich usunąć całkowicie (filtruję na poziomie 'Best`, dzięki czemu większości artykułów nie widzę ale jakąś perełkę mogę od czasu do czasu zobaczyć).
Mój skrypcik pozwala w łatwy sposób przepiąć się z czytania jakiegoś kanału bezpośrednio na czytanie go via PostRank - i odwrotnie.
Obsługujemy to tak:
-
robimy normalne
greader2org get
, zgodnie z opisem wyżej; -
przeglądamy
feeds.txt
i flagujemy wszystkie prywatne kanały (kanały których nie powinny w żadnym wypadku trafić na PostRank) jako:private:
, -
uruchamiamy
$ greader2org postrank
spowoduje to dopisanie postrank_feed:
do wszystkich kanałów,
dla których uda się odpowiedni adres ustalić (a dla których
nie był dotychczas znany),
-
powyższe polecenie może zaraportować niektóre kanały jako nieosiągalne na PostRanku (będą to te, których nikt jeszcze przez ten serwis nie przepuścił), aby je dodać rejestrujemy się na tym serwisie, wrzucamy tam te kanały i ... powtarzamy
greader2org postrank
nazajutrz, -
edytujemy
feeds.txt
i wpisujemylevel: best
albo
`level: great`
albo
`level: good`
przy kanałach, które chcemy filtrować (best
wybiera tylko
najwyżej oceniane artykuły, good
łapie pozycje, które spowodowały
jakiekolwiek zainteresowanie, great
leży pomiędzy),
- uruchamiamy zwykłe
greader2org put
, które oprócz normalnych zmian także odsubskrybuje orginalne kanały i zasubskrybuje w zamian wersje przepuszczone przez filtr.
Aby wyłączyć filtrowanie po prostu usuwamy level
(i odpalamy
greader2org put
).
Znane problemy
Kilka znanych mi problemów, których raczej nie poprawię.
Hasła otwartym tekstem
Hasło do Google można by trzymać mądrzej niż otwartym tekstem. Pomysły jak to najporęczniej rozwiązać nie tworząc dedykowanych wersji dla każdego środowiska graficznego są mile widziane.
Gubienie luźnych dopisków w pliku feeds.txt
Plik feeds.txt
jest całkowicie przepisywany w czasie greader2org
get
a także greader2org postrank
. W trakcie tej operacji wszystkie
elementy oprócz udokumentowanych wyżej (np. luźne komentarze czy pola o
nieznanych etykietach) są gubione.
Błąd parsowania przy pustych folderach
Pusty folder, tj. zapis:
* Folder1
* Folder2
** jakiśfeed
generuje błąd parsowania (tu - ponieważ Folder1
nic nie zawiera).
Nielegalne znaczki powodują wywrotkę
Umieszczenie w nazwie folderu albo kanału znaczków, które nie podobają się Google
Readerowi (są nimi min. slash /
oraz przecinek ','), powoduje taki
efekt:
HTTP Error 400: Bad Request <class 'urllib2.HTTPError'>
Traceback (most recent call last):
(...)
Ponieważ wszystkich przypadków w których Google Reader może tu kaprysić
i tak nie znam, a najlepszym co mógłbym tu zrobić byłoby zgłoszenie
lepiej brzmiącego błędu, machnąłem ręką. W takiej sytuacji wystarczy
poprawić odpowiedni tytuł i puścić put
ponownie.
Kod źródłowy
Aby obejrzeć kod źródłowy trzeba po prostu ściągnąć jajko
(tj. plik mekk.feeds-1.1.0-py2.5.egg) i rozpakować
je (jest to zwykły plik .zip
).
Informacje o API Google Readera czerpałem z tej strony (weryfikując wątpliwości Firebugiem). Opis API Postranku znalazłem u oficjalnego źródła (można by w oparciu o nie zrobić więcej, min. eliminując potrzebę kopiowania i wklejania adresów do rejestracji na stronie Postranku - ale nie miałem na razie cierpliwości przebijać się przez specyfikację OAuth).