PRagger + DSL なんてのはいかがでしょうか?
PRagger を YAML で設定するのではなく、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
ソースコード
本家 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