=begin # download_radio ネットラジオから音声ファイルをダウンロードする。 ## 注意 win32apiを利用しているので、ActiveScriptRuby等でないと動作しない。 ## ダウンロード http://bmky.net/product/pragger/#download_radio ## 解説 フィードデータのリンク要素からラジオを視聴するためのURLを取得し、 そこからラジオ本体のURLを探してダウンローダーに渡す。 asxdirを指定すると、ダウンロード失敗時等の保険として asxファイルを保存する。 savedirを指定すると、ダウンロードした番組本体を リネームするためのバッチファイルを作成する。 メディファクラジオのみMPlayerでダウンロードできないので NetTransportを利用。 ## 使い方 - module: myplugin::download_radio config: app_mp: C:\MPlayer.exe # ダウンロードに使用するアプリケーション app_nt: C:\NetTransport.exe # ダウンロードに使用するアプリケーション asxdir: asx/ # asxファイルを保存しておくディレクトリ savedir: c:\radio\ # リネーム用のバッチファイルを作成するディレクトリ ## 更新履歴 2009/09/01 : アニメイトTVのリニューアルに対応 2008/09/13 : MPlayerに対応 2008/05/01 : リリース =end require 'open-uri' require "Win32API" def download_radio( config, data ) return data unless config["app_nt"] or config["app_mp"] data.each do |item| asxurl = item.link asxname = "" asxtext = "" if item.link =~ /play\.php\?id=\d+/ asxtext = open("http://www.animate.tv/" + asxurl, "Referer" => "http://www.animate.tv/") {|f| f.read.gsub(/\r/, "") } asxname = asxtext.scan(/href=".*?\/([^\/]*?\.(?:wma|asx))"/)[0][0] else asxtext = open( asxurl ) { |f| f.read.gsub( /\r/, "" ) } asxname = asxurl.scan( /([^\/]*?\.asx)$/ )[0][0] end # asxをバックアップ if config["asxdir"] asxdir = ( config["asxdir"] + "/" ).sub!( /\/+$/, "/" ) open( asxdir + asxname, "w" ){ |w| w.puts asxtext } end asxtext.gsub( /"((?:mms|http):\/\/.*?(?:wma|asf|mp3|wsx|wmv))"/ ) do url = $1 # CMはダウンロードしない next if ( asxurl =~ /onsen/ and ( url =~ /cm/ ) != nil ) p "download " + url fname = url[ /([^\/]*?(\.(?:wma|asf|mp3|wsx|wmv)))/, 1 ] # ダウンローダーにURLを渡す if asxurl =~ /mediafactory/ # メディファクはNetTransportでダウンロードさせるためにプロトコルを変換 url.sub!( /mms/, "http" ) if asxurl =~ /mediafactory/ shellexecute = Win32API.new( 'shell32.dll', 'ShellExecute', [ "P", "P", "P", "P", "P", "I" ], 'i' ) unless shellexecute.call( 0, "open", config["app_nt"], url, 0, 1 ) > 0 raise "NetTransport: ShellExecute failed." end else shellexecute = Win32API.new( 'shell32.dll', 'ShellExecute', [ "P", "P", "P", "P", "P", "I" ], 'i' ) unless shellexecute.call( 0, "open", config["app_mp"], "-dumpstream " + url + " -dumpfile " + config["savedir"] + fname + " -quiet", 0, 1 ) > 0 raise "MPlayer: ShellExecute failed." end end # リネーム用のバッチファイルを作成 if config["savedir"] if url =~ /([^\/]*?(\.(?:wma|asf|mp3|wsx|wmv)))/ wmaname = $1 ext = $2 date = "" date = "_" + wmaname[ /(\d+)\./, 1 ] if asxurl =~ /onsen/ wmaname.gsub!( /\./, "(1)." ) if asxurl =~ /mediafactory/ safe_title = item.title.gsub( /\s/, "_" ).gsub( /\//, "/" ).gsub( /\:/, ":" ).gsub( /\,/, "," ).gsub( /\;/, ";" ).gsub( /\*/, "*" ).gsub( /\?/, "?" ).gsub( /\/, ">" ).gsub( /\|/, "|" ) cmd = "REN " + wmaname + " " + safe_title + date + ext open( config["savedir"] + wmaname + ".bat", "w" ){ |w| w.puts cmd.tosjis } end end sleep( 3 ) end end return data end