Sonntag, 29. August 2010

Yahoo! Pipes: RSS-Feeds "subtrahieren"

Wenn man (wie ich) ein fleißiger Leser von Newsfeeds ist, kommt es u.U. vor, dass man einen abonnierten (RSS-/Atom-)Feed ohne bestimmte Beiträge bekommen möchte. Wenn diese Beiträge nicht mittels eines einfachen Filters definiert werden können, sondern Inhalte eines anderen Feeds sind, wird es schwierig und es kann dafür Yahoo! Pipes verwendet werden.

Nochmal die Aufgabenstellung: Ziel ist es, einen Feed zu bekommen, in dem alle Beiträge von Feed A vorkommen, aber alle Beiträge, die auch in Feed B vorhanden sind, herausgefiltert wurden, also die Differenzmenge von Feed A und Feed B. Um es noch etwas konkreter zu machen: Ich möchte alle Spiegel-Online-Beiträge (RSS-Feed) ohne die Beiträge des Sport-Feeds von Spiegel Online (RSS-Feed).

Leider gibt es für diesen Fall keinen vordefinierten Operator-Block bei Yahoo! Pipes, sodass man selbst Hand anlegen muss.


Hier eine Erklärung, wie das Ganze funktioniert:

  • Zunächst legt man für jeden Feed (in meinem Fall SP.ON komplett sowie SP.ON Sport) ein Fetch-Feed-Modul an und kopiert die URL der Feeds in das jeweilige URL-Feld.
  • Anschließend wird mit einer Loop über einen String Builder jedem Beitrag ("item") der beiden Feeds eine Markierung hinzugefügt, die die Beiträge eindeutig einem der Feeds zuordnet. Einträge des ersten Feeds bekommen ein zusätzliches Feld "source" ("item.source") mit dem Inhald "Feed A", analog werden Beiträge des zweiten Feeds mit item.source = "Feed B" gekennzeichnet.
  • Beide Feeds werden nun mit einem Union-Modul vereinigt.
  • Mit Hilfe eines Unique-Moduls werden anschließend Einträge, deren "link"-Feld identisch ist, kombiniert.
    Anmerkung: Hier muss man bei anderen Quellen evtl. auf andere Felder ("title") zurückgreifen, wenn die Links der Einträge sich bspw. durch einen Parameter unterscheiden.
  • Jetzt kommt der Trick des Aussortierens: Über ein Filter-Modul werden nun nur Einträge weitergereicht, deren "y:repeatcount"-Feld gleich 1 und die Quelle (item.source) "Feed A" ist.
    Info: Das "y:repeatcount"-Feld wird vom Unique-Modul für jeden Beitrag gesetzt und enthält die Anzahl der Beiträge, die es zu dem jeweiligen Beitrag zusammengefasst hat.
  • Das Ergebnis wird schließlich an den Pipe Output weitergereicht (und kann hier abgerufen werden: http://pipes.yahoo.com/pipes/pipe.run?_id=e95a7dc4cd639af9710a95d62000e9d5&_render=rss)

Sollte jemand noch ein paar coole Dinge mit Yahoo! Pipes angestellt haben, möge er/sie einen Kommentar posten...


Ergänzung: