PRagger + DSL なんてのはいかがでしょうか?

PRaggerYAML で設定するのではなく、DSL で設定する試みです。

以下のような YAML 設定なら、

# vim: set expandtab ts=4 sts=2 sw=2 tw=0 ft=pra syntax=yaml:

- module: Subscribe::Nicovideo::mylist
  config:
    mailaddress: 'メールアドレス'
    password: 'ぱすわーど'
    mylist_id: '5139713'
    dir: 'C:/home/develop/trunk/ruby/pragger/config'

- module: Filter::ffmpeg
  config:
    command: 'C:/home/opt/bin/ffmpeg'
    dir: 'C:/home/develop/trunk/ruby/pragger/config/enclosure'
    profile: 'ipod_touch'
    filename: '%title%.mp4'
    encoding: 'sjis'
    format: 'mp4'
    extra_options: '-level 30 -g 300 -coder 0'

- module: Publish::rss
  config:
    title: ニコニコ動画 マイリスト 5139713
    description: ニコニコ動画 マイリスト Pragger テスト
    filename: 'C:/home/develop/trunk/ruby/pragger/config/mylist.xml'

以下のような DSL 設定ファイルに置き換えることができる

plugin の引数に実行するプラグインの名前を指定し、
do 〜 end で囲まれた部分に設定を記述する。

plugin 'Subscribe::Nicovideo::mylist' do
  mailaddress 'めーるあどれす'
  password  'ぱすわーど'
  mylist_id '5139713'
  dir 'C:/home/develop/trunk/ruby/pragger/config'
end

plugin 'Filter::ffmpeg' do
  command 'C:/home/opt/bin/ffmpeg'
  dir 'C:/home/develop/trunk/ruby/pragger/config/enclosure'
  profile 'ipod_touch'
  filename '%title%.mp4'
  encoding 'sjis'
  format 'mp4'
  extra_options '-level 30 -g 300 -coder 0'
end
 
plugin 'Publish::rss' do
  title 'ニコニコ動画 マイリスト 5139713'
  description 'ニコニコ動画 マイリスト Pragger テスト'
  filename  'C:/home/develop/trunk/ruby/pragger/config/mylist.xml'
end

実行方法は?

本家 PRagger と同じです。

$ ./pragger-dsl.rb -c config.dsl

互換プラグインは?

他のプラグインのテストはしていないので、恐らく動くだろうとしか言えません。

ソースコード

本家 PRaggr のソースコードに少し追加した感じです。
あまりスマートじゃないですけれど。

#!/usr/bin/env ruby
$KCODE='u'
require 'yaml'
require 'optparse'
require 'kconv'
require 'pathname'
require 'base64'

$plugins = {}
class Plugin
  attr_reader :source
  def initialize(file)
    instance_eval( @source = File.read(file).toutf8, file , 1)
  end
  def self.load_plugins(folder = (Pathname.new(__FILE__).parent + "plugin"))
    Pathname.glob(folder + "**/*.rb").sort.each do |file|
      begin
        $plugins[ file.relative_path_from(folder).to_s.gsub("/","::")[0..-4] ]= Plugin.new(file)
      rescue LoadError
      end
    end
  end
end

def eval_pragger(command_array,data)
  command_array.inject(data) do |data, command|
    STDERR.puts "exec plugin #{command["module"]}"
    $plugins[command["module"]].send(command["module"].sub(/.*::/,""), command["config"] || {}, data.dup)
  end
end

Plugin.load_plugins()

######## 以下、追加したコード ########

class PraConfig
  attr_accessor :config

  def initialize
    @config = {}
  end

  def self.parse(&block)
    r = nil
    config = PraConfig.new
    r = config.instance_eval(&block)  unless block.nil?
    if r.is_a?(Array)
      r
    else
      config.config
    end
  end

  def method_missing(name, *argv, &block)
    n = name.to_s
    unless block.nil?
      @config[n] = PraConfig.parse &block
    else
      @config[n] = argv
    end
    @config[n] = @config[n][0]  if @config[n].is_a?(Array) && @config[n].length == 1

    n
  end
end

$pragger_data = []

def plugin(name, &block)
  config = {}
  config = PraConfig.parse(&block)  unless block.nil?
  command = [{"module"=> name, "config" => config}]
  $pragger_data = eval_pragger(command, $pragger_data.clone)
end

if $0 == __FILE__
  configFile = "pra.conf"

  opt = OptionParser.new
  opt.on("-c", "--configfile CONFIGFILE") {|v| configFile = v }
  opt.on("-p", "--plugindir PLUGINDIR") {|v| Plugin.load_plugins(Pathname.new(v)) }
  opt.on("-u", "--pluginusage PLUGINNAME") {|v| $plugins[v].source.gsub(/^## ?(.*)/){ puts $1 }; exit }
  opt.on("-l", "--listplugin") { $plugins.keys.sort.each{|k| puts k }; exit }
  opt.on("-w", "--where") { puts(Pathname.new(__FILE__).parent + "plugin"); exit }
  opt.parse!

  eval(File.read(configFile).toutf8)
end

参考

PRagger