image

  • フォト Amazonギフト券
    ※この時計の時刻は、閲覧しているパソコンのものであり、必ずしも正確な時間とは限りません

検索

最近のトラックバック

無料ブログはココログ

« いのうえ歌舞伎☆號『IZO』を観た | トップページ | 彩の国シェイクスピア・シリーズ「リア王」を観た »

2008-02-03

youtube 動画を ruby で download する

web 上のいくつかのソースコードを参考にして、ruby で youtube のデータを download するコマンドラインツールを作ってみた。

使用例はこれ。

$ ruby videoget.rb "http://jp.youtube.com/watch?v=J7JmsMMIR4Y"
download YouTube_-_回りすぎ.flv...
YouTube_-_回: 100% |oooooooooooooooooooooooooooooooooooooooo| ETA:  00:00:00

ソースコードは以下。(MacosX 10.4 ruby 1.8.6)
   「videoget.rb.txt」をダウンロード
---- ここから ----
#!/usr/bin/env ruby
# 2008-02-03 katoy
# See http://d.hatena.ne.jp/subuntu/20071010
#      > RubyでYoutubeの動画をダウンロード
#     http://d.hatena.ne.jp/yumimue/20080129/1201608634
#      > wgetでYouTube等から動画を落とす

require 'rubygems'
require "net/http"
require "open-uri"
require 'cgi'
require "kconv"
require "progressbar"  # gem install progressbar (0.0.3)
require "pp"

def get_page_content(url)
  begin
    res = Net::HTTP.get_response(URI.parse(url))
    raise unless Net::HTTPSuccess === res
    res.body
  rescue
    raise Error.new('unable to download video page')
  end
end

def get_youtube_url(url)
  result = ""
  title = ""
  dl_url = ""

  # まずは/watch_video?v=hogeにリクエストを投げて、ビデオの実際のありかを
  # 教えてもらう。このとき、レスポンスは200とかではなく、303などが返ってくる。
  # したがって、body部ではなく、ヘッダ部の情報をもとにビデオの実際のありかを
  # 取得する。
  video_id = $1 if url =~ /v=([^&]+)/
  Net::HTTP.start("www.youtube.com", 80) do |http|
    response = http.get("/watch_video?v=#{video_id}")
    if response['location'] =~ /¥&t=([^&]+)/   # ヘッダのlocation部を調べる
      dl_url = "http://www.youtube.com/get_video?video_id=#{video_id}&t=#{$1}"
    end
  end

  # タイトルを取得
  content = get_page_content(url)
  title = $1.toutf8.gsub(/¥//, "_").gsub(/¥s+/, "_") + ".flv"  if content =~ /<title>(.+?)<¥/title>/

  {:dl_url => dl_url, :title=>title}
end

def get_yourfilehost_url(url)
  content = get_page_content(url)
  title = %r!http://(?:www¥.)?yourfilehost¥.com/media¥.php¥?cat=video&file=([¥w.-]+)¥.!.match(url).to_a[1] + ".wmv"
  params = %r!videoembed_id=([¥w%.-]+)&! .match(content).to_a[1..-1]
  dl_url =  CGI.unescape(params.first)

  {:dl_url => dl_url, :title=>title}
end

def get_movie(info)
  title = info[:title]
  url = info[:dl_url]
  pbar = nil

  File.open(title, "wb") do |f|
    open(url,
      :content_length_proc => lambda {|t|
        if t && 0 < t
          pbar = ProgressBar.new(title, t)
        end
      },
      :progress_proc => lambda {|s|
        pbar.set s if pbar
      }) do |io|
      f.write io.read
    end
  end
end

def get_video_info(url)
  info = []
  info = get_youtube_url(url)       if url =~ %r!¥Ahttp://(?:¥w+¥.)youtube¥.com/watch¥?v=([¥w-]+)!
  info = get_yourfilehost_url(url)  if url =~ %r!http://(?:www¥.)?yourfilehost¥.com/media¥.php¥?cat=video&file=([¥w.-]+)¥.!
  return info
end

def download_video(url)
  info = get_video_info(url)
  puts "download #{info[:title]}..."
  get_movie(info)
end

def usage
  puts "Usage: ruby videoget.rb [url ...]"
  puts "  supported: youtube:       http://???.youtube.com/watch?v= ..."
  puts "             yourfilehost:  http://www.yourfilehost.com/media.php?cat=video ..."
end

#------------ Main -------------
usage if ARGV.empty?

ARGV.each do |url|
  begin
    download_video(url)
  rescue => ex
    pp ex
    pp url
  ensure
    puts
  end
end
---- ここまで ----

jruby でも 動作したが、日本語ファイル名が化けた。($KCODE 設定とかしないとダメなのかも?)

データのダウンロード/一覧表示/検索の GUI を xfy/xvcd でつくると良いかもしれない。

« いのうえ歌舞伎☆號『IZO』を観た | トップページ | 彩の国シェイクスピア・シリーズ「リア王」を観た »

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/184434/17943678

この記事へのトラックバック一覧です: youtube 動画を ruby で download する:

« いのうえ歌舞伎☆號『IZO』を観た | トップページ | 彩の国シェイクスピア・シリーズ「リア王」を観た »

mokuji

2013年12月
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 31        

google

  • twitter
  • __
  • _
    Googleボットチェッカー

合わせて読む

  • 合わせて読む
    フィードメーター - katoy: cocolog あわせて読みたい

リンク