#!/usr/bin/env ruby
#
# Copyright (c) 2009, neingeist <neingeist@bl0rg.net>
# Copyright (c) 2005, Joe Mason <joe@notcharles.ca>
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to permit
# persons to whom the Software is furnished to do so, subject to the
# following conditions:
#
# The above copyright notice and this permission notice shall be included
# in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
# NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
# OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
# USE OR OTHER DEALINGS IN THE SOFTWARE.
#
# Usage: rss-title-filter <list of titles to include>
#
#        Skips all items which do NOT include the given titles.
#
#        Example: to include all entries with the title "meme", "quiz" or
#        "picture post", do:
#
#        rss-title-filter meme quiz "picture post"
#
#        Requires the Ruby RSS module, which is included in Ruby 1.8.3 or
#        higher and available for older versions of Ruby at
#        http://raa.ruby-lang.org/project/rss/.
#
#        based on "rss-tag-filter" by Joe Mason.


require 'rss/2.0'

# if no titles were given, no parsing needed
if ARGV.empty? then
  STDIN.each do |line|
    STDOUT.puts(line)
  end
  exit(0)
end

# parse the RSS
rss_source = STDIN.collect.join
begin
  rss = RSS::Parser.parse(rss_source)
rescue RSS::InvalidRSSError
  rss = RSS::Parser.parse(rss_source, false)    # no validation
end

# filter out all items NOT in the cmd-line args
rss.channel.items.reject! do |item|
  found = false
  ARGV.each do |arg|  
    if Regexp.new(arg, Regexp::IGNORECASE).match(item.title)
      found = true 
    end
  end
  !found
end

# write the modified rss
STDOUT.puts(rss)