#!/usr/local/bin/ruby # tvguide-get.rb by anakata@vdnet.or.jp # インターネットTVガイドから一週間分の番組表のURLを持ってくる # 画像を取ってこないのでちと見栄え悪し → --get-iconで対応('00/05/02) # # '00/04/30 initial version. # '00/05/02 ページ内のiconへのリンクを相対パスに書き換え # ページ内の外部へのリンクをCGI経由から直接リンクに書き換え # '00/05/02 option追加(--span, --offset, --dir-to-save, --get-icon, --help) require 'url-parse' require 'http-access' require 'getoptlong' TVGUIDE_BASEURL = 'http://www.tvguide.or.jp/tableg/' # Gコード番組表 # TVGUIDE_BASEURL = 'http://www.tvguide.or.jp/table/' # 通常番組表 TVGUIDE_ICON_BASEURL = 'http://www.tvguide.or.jp/gif/' ICON_LIST = ['2.gif', 'bmode.gif', 'clear.gif', 'moji.gif', 'n.gif', 'noscr.gif', 'sai.gif', 'shin.gif', 'shu.gif', 'shuwa.gif', 'stereo.gif', 'taju.gif', 'w.gif', 'wide.gif'] #----------------------------------------------------------------- # 下位手続きの定義 # page_get # URLとファイル名を指定すると、URLの内容をHTTPで取得し、ファイルに保存する. # なお、イテレータとして呼び出した場合には、取得した内容をブロックに渡し、 # その戻り値をファイルに保存する. # URLが存在し、正常にファイルに保存できればtrue、さもなくばfalseを返す. def page_get(urlstr, filename) url = URL.new(urlstr) http = HTTPAccess.new(url.host, url.port) if url.query http.request_get(url.path+'?'+url.query) else http.request_get(url.path) end http.get_response if http.code == '404' return false end begin f = File.new(filename, 'w') begin f.binmode data = '' http.get_data(65536) {|chunk| if chunk != nil data << chunk end } if defined? yield f.print yield(data) else f.print data end ensure f.close end return true rescue return false end end # ディレクトリがないときは作成するchdir # ただし再帰作成は行わない def force_chdir(dir) if FileTest.exist?(dir) if FileTest.directory?(dir) Dir.chdir(dir) else puts "error: #{dir} is not directory." exit(1) end else begin Dir.mkdir(dir) rescue puts "error: #{dir} can't create." exit(1) end Dir.chdir(dir) end end #----------------------------------------------------------------- # オプション取得・設定 parser = GetoptLong.new parser.set_options( ['--span', '-s', GetoptLong::REQUIRED_ARGUMENT], ['--offset', '-o', GetoptLong::REQUIRED_ARGUMENT], ['--dir-to-save', '-d', GetoptLong::REQUIRED_ARGUMENT], ['--get-icon', '-i', GetoptLong::NO_ARGUMENT], ['--help', '-h', GetoptLong::NO_ARGUMENT] ) begin parser.each_option do |name, arg| eval "$OPT_#{name.sub(/^--/, '').gsub(/-/, '_').upcase} = '#{arg}'" end rescue exit(1) end if $OPT_HELP print <' f.print list f.print '' ensure f.close end rescue end