Hatena::Grouprubyist

たばさの RSSフィード

06/14(日) 2009

podcastを聴く、コマンドライン用

| podcastを聴く、コマンドライン用 - たばさの を含むブックマーク はてなブックマーク - podcastを聴く、コマンドライン用 - たばさの

podcast-get.rb

#!ruby
#cf. http://777.boo.jp/adiary/0780 など
require 'rss'
require 'optparse'

$interval=3
opt = OptionParser.new
opt.on('-a') {|v| $all=true }
opt.on('-f file') {|v| $infile=v }
opt.on('-i interval') {|v| $interval=v }
opt.on('-o only') {|v| $only=v }
opt.parse!(ARGV)
#p $all,$infile

#保存先フォルダ
savefbase="d:\\podcast\\"
#RSSリスト。httpアドレス、名前、空行の繰り返し
rssfile = $infile || "d:\\podcast\\podcast_rss.txt"
#取得済みファイル名のリスト
gotlistfile="d:\\podcast\\podcast_gotlist.txt"
#保存する合計サイズ
savemax=3_000_000_000


class Array
  def sumsize
    self.inject(0){|res,i| res+File.size(i)}
  end
end

#コンテンツのURLを受け取ってsavefile(ファイルパス)にファイル保存(上書き)
def get_content(url,savefile,logfile)
  begin
    u=open(url).read
      open(savefile,"wb"){|f|
        f.write u
      }
      open(logfile,"a"){|f|
        f.puts File.basename(savefile)
      }
  rescue => ex
    print ex.message,"\n"
  end
end

def existcheck name,filename,list
  item=name+"_"+ filename
  FileTest.file?(item) || list.member?(item) || list.member?(filename)
end

def getitem item,base,name,gotlist,gotlistfile
      begin
        content_url = item.enclosure.url
      rescue
        content_url = item.content.to_s.split("\n").map{|i| i=~/"(http:[^"]+\.mp3)"/;$1}.select{|i|i}.uniq[0]
      end
      return if not content_url
      filename = content_url.split('/')[-1]  #ファイル名取得
      filename=filename.sub(/\?.*/){""}
      content = base  + name+"_"+ filename
      #return
      unless existcheck(name,filename,gotlist)
        print "   ",content_url,"\n   =>",content
        get_content(content_url,content,gotlistfile)
        print " ok\n"
      end
end

#RSSを受信して、同じファイルが保存済みでなければダウンロードする
def get_rss(url,base,name,all,gotlistfile,interval=2)
  begin
    rss = RSS::Parser.parse(url,false)
    if all
      rss.items.each{|item|
        getitem item,base,name,$gotlist,gotlistfile
        sleep interval
      }
    else
      item = rss.items[0]
      getitem item,base,name,$gotlist,gotlistfile
    end
  rescue => ex
    print ex.message,"\n"
  end
end

#podcast_rss.txtからrssのurlと名前を読み出す。
#さらにRSS受信して保存してないものがあればダウンロードする
$gotlist=File.readlines(gotlistfile).map{|i|i.chomp}
STDERR.puts "gotlist size #{$gotlist.size}"
open(rssfile){|podcast_rss|
 while line = podcast_rss.gets
  line.chomp!
  if line[0,7] == "http://"
    url = line
    if name = podcast_rss.gets
      name.chomp!
    else
      name = ""
    end
    next if $only and name !~ /#{$only}/
    puts "#{name}: #{url} 開始"
    get_rss(url,savefbase,name,$all,gotlistfile,$interval)
    puts "#{name}: 終了"
  end
 end
}
STDERR.puts "fin."
t= Dir.glob(savefbase.gsub("\\"){"/"}+"*")
STDERR.puts "#{tmp=t.sumsize}(#{format "%.2f",tmp*100.0/savemax}%)"
STDERR.puts "#--------------over #{savemax}, please backup or clean up." if t.sumsize>savemax 

lilith-.rb

# lilithが必要 => http://www.vector.co.jp/soft/win95/art/se174814.html
# lilithあるいはほかの再生用ソフトのpath

require 'optparse'

$player="lilith"
opt = OptionParser.new
opt.on('-p player') {|v| $player=v }
opt.parse!(ARGV)

f=ARGV[0]
count=ARGV[1] || 5
#保存先フォルダ、複数なら\0で区切り
list=(Dir.glob"d:/podcast/*.mp3\0e:/*.mp3").select{|v|v=~/#{f}/}.sort_by{|f| File.mtime f }.reverse[0...count.to_i]
STDERR.puts list*"\n"
`#{$player} #{list*" "}`

news.bat

call podcast-get.rb -o cnn
lilith- News

 -- 使い方 --


RSSリストの名前がcnn-newsのものだけすべて取得保存

> podcast-get.rb -a -o cnn-n

ファイル名にNewsを含むもの7個を再生

> lilith-.rb News 7

更新してから再生

> news

短くしないと使わなくなるので。


podcast_rss.txtの例

http://downloads.bbc.co.uk/podcasts/worldservice/globalnews/rss.xml
bbc

http://rss.cnn.com/services/podcasting/marketplace/rss.xml
cnn-biz

http://rss.cnn.com/services/podcasting/newscast/rss.xml
cnn-news

http://totsuka-groovy.radilog.net/index20.rdf
totsuka

http://asahi-press.seesaa.net/index20.rdf
listen-asahi

http://peevee.tv/mypagerss.jspx?User=48004238
sara

--http://www.eslpod.com/past.xml
--esl-old
--(行頭が「http://」で始まるもの以外はスキップされる)

http://feeds.feedburner.com/EnglishAsASecondLanguagePodcast
esl

http://www.voanews.com/specialenglish/customcf/podcastxml.cfm?id=1319
voanews

http://www.businessenglishpod.com/feed/
Business-English-Pod

http://feeds.conversationsnetwork.org/channel/itc
IT-Conversations

http://feeds.feedburner.com/cnet/newsdaily?tag=rtcol
cnet

ファイル名が重ならないようにするにはnameを保存ファイル名の先頭に付けるなど。

追記:

http://kovensky.project357.com/

ここのMPlayerを使うとGUIを使わずコマンドラインで完結できた。スペースキーで一時停止など。

> lilith- -p "mplayer.exe -speed 1.15" News

など

追記(2009/06/25):

podcast-get.rb: (podcastではenclosure要素にmp3などを置くようだが)rssにenclosure要素がないときhttp://...mp3を探すように修正。

トラックバック - http://rubyist.g.hatena.ne.jp/hatecha/20090614
カレンダー
<< 2009/06 >>
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
archive Error : RSSが取得できませんでした。