You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

73 lines
2.3 KiB
Ruby

#!/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)