# Yahooから番組表をダウンロードして、連結する
# Kawauchi.k 2001/1/19
# このファイルはEUCでセーブしないと動きません
=begin
AREAに下記の値を設定して、読む地域を指定する
hokk 北海道
aomori 青森
iwate 岩手
miya 宮城
akita 秋田
yamagata 山形
fuku 福井
niigata 新潟
nagano 長野
toyama 富山
ishikawa 石川
fukui 福井
tokyo 東京
kanagawa 神奈川
saitama 埼玉
chiba 千葉
ibaraki 茨城
tochigi 栃木
gunma 群馬
yamanasi 山梨
aichi 愛知
gifu 岐阜
mie 三重
sizu 静岡
siga 滋賀
kyoto 京都
osaka 大阪
hyougo 兵庫
nara 奈良
wakayama 和歌山
tottori 鳥取
shimane 島根
okayama 岡山
hirosima 広島
yamagchi 山口
tokusima 徳島
kagawa 神奈川
ehime 愛媛
kouchi 高知
fukuoka 福岡
saga 佐賀
nagasaki 長崎
kumamoto 熊本
oita 大分
miyazaki 宮崎
kagosima 鹿児島
nawa 沖縄
=end
require 'net/http'
AREA = 'tokyo' # ダウンロードする地域
DAYS_NUM = 3 # ダウンロードする日数
SRC_PAGE = 'Yahoo vhf'
#SRC_PAGE = 'Yahoo uhf' #BSのデータを取得したいときはこちらを有効に
OUT_FILE = 'tv.html' # 出力ファイル
#
# アドレスを サーバー、ポート、パスに分割する
#
def url_split(url)
/^http:\/\/([^\/]*)(\/?.*)/ =~ url
server = $1
path = $2
if server.index(':') then
server, port = server.split(':')
end
port = '80' if port == nil
port = port.to_i
return server, port, path
end
#
# Webからデータを取得
#
def webget(url)
server, port, path = url_split(url)
http = Net::HTTP.new( server, port )
response = http.get2(path)
response.body
end
#
# テーブルの中身を取り出す
#
def table_trim(html)
/
(.*?)<\/TABLE>/m =~ html
/.*?<\/TR>(.*)/m =~ $1
return $1
end
#
# 表のヘッダーを取り出す
#
def header_trim(html)
/(.*?)<\/TABLE>/m =~ html
/(.*?<\/TR>)/m =~ $1
return $1
end
#
# 表のフッターを取り出す
#
def footer_trim(html)
/(.*?<\/TABLE>)/m =~ html
return $1
end
#
# 表中に使われているグラフィックのアイコンをテキストに置換する
#
def mark_chenge(html)
html.gsub!(//im) {|s|
/\/([^\/]*?)\.gif/i =~ s
case $1
when 'n' # ニュース
'[N]'
when 'w' # 天気
'[天]'
when 'shin' # 新番組
'[新]'
when 'shu' # 最終回
'[終]'
when 'sai' # 再放送
'[再]'
when 'stereo' # ステレオ
'[S]'
when 'bmode' # Bモード
'[B]'
when '2' # 二ヶ国語放送
'[2]'
when 'taju' # 音声多重
'[多]'
when 'noscr' # ノンスクランブル
'[ノ]'
when 'wide' # ワイドビジョン
'[W]'
when 'clear' # クリアビジョン
'[C]'
when 'mono' # 白黒放送
'[白黒]'
when 'moji' # 文字多重放送
'[字]'
when 'shuwa' # 手話放送
'[手]'
else
s
end
}
return html
end
#
# 番組表のアドレスを作る
#
def make_uri(area, tm)
if SRC_PAGE == 'Yahoo uhf' then
file_name = tm.strftime('%Y%m%d%H') + '.html'
'http://tv.yahoo.co.jp/tvguide/uhf_bs/' + area + '/table/' + file_name
else
file_name = tm.strftime('%Y%m%d%H') + '.html'
'http://tv.yahoo.co.jp/tvguide/vhf/' + area + '/table/' + file_name
end
end
#
#
#
def get_wday(tm)
wday = ['日','月','火','水','木','金','土'][tm.wday]
end
#
# データが取得できたか?
#
def is_valid(s)
s.index('(not found)') == nil
end
#
# main
#
sec,min,hour,day,month,year = Time.now.to_a
tm = Time.local(year,month,day)
hour_step = [4,7,10,13,16,19,21,23,25]
html = "ty guide\n"
# インデックス
cur_tm = tm
DAYS_NUM.times do |id_count|
link_str = cur_tm.strftime('%Y/%m/%d')
html << sprintf("%s(%s)\n", id_count, link_str, get_wday(cur_tm))
hour_step.each do |hour|
html << sprintf("%d時\n", id_count, hour, hour )
end
html << "
\n"
cur_tm += 24 * 60 * 60
end
# 番組表
table_header = ''
table_footer = ''
DAYS_NUM.times do |id_count|
table = ''
hour_step.each do |hour|
cur_tm = (tm + (hour*60*60)) # 時間数を秒単位で加算
src_page = webget(make_uri(AREA, cur_tm))
if not is_valid(src_page) then
table = "データがありません |
\n"
break
end
if table_header == '' then
table_header = header_trim(src_page)
table_footer = footer_trim(src_page)
end
src_page.gsub!('',sprintf("
", id_count, hour))
table << table_trim(src_page)
end
wday = get_wday(tm)
html << sprintf("%d/%d/%d(%s)
\n", id_count, tm.year,tm.month,tm.day,wday)
html << "\n"
html << table_header
html << table
html << "
\n"
tm += 24 * 60 * 60 # 一日進める
end
html << "
\n"
html << table_footer
out = open(OUT_FILE,"w")
out.print mark_chenge(html)
out.close