rubyIl y a quelques temps je poposais un petit script pour télécharger des vidéos directement sur le site de Vimeo et les stocker sur son disque dur. Comme le temps de téléchargement peut être très long, j'y ai ajouté une progressbar !

Un petit

gem install progressbar

et roulez (J'ai testé ce script sous Linux et Windows).

#!/usr/bin/ruby

require 'rubygems'
require 'progressbar'
require 'net/http'

if ARGV.size < 1
    puts "usage vimeo.rb "
    exit 1
else
    id = ARGV[0]
        Net::HTTP.start('www.vimeo.com') {|http|
            req = Net::HTTP::Get.new("/moogaloop/load/clip:#{id}", nil)
            response = http.request(req)
            /(.*)<\/caption>/.match(response.body)
        title = $1
        title = title.gsub(/\:/,'')
        /(.*)<\/request_signature>/.match(response.body)
        signature = $1
        /(.*)<\/request_signature_expires>/.match(response.body)
        signatureExp = $1
        puts title
        req = Net::HTTP::Get.new("/moogaloop/play/clip:#{id}/#{signature}/#{signatureExp}/?q=hd", nil)
        http.request(req) { |response|
                /(mp4|flv)/.match(response['location'])
                ext = $1
                print "File type : ",ext,"\n"
                /http:\/\/(.*\.vimeo\.com)(\/.*)/.match(response['location'])
                Net::HTTP.start($1) {|http|
                    req = Net::HTTP::Get.new($2)
                    alreadyDL = 0
                    http.request(req) { |response|
                        puts response['location']
                        pBar = ProgressBar.new(title,100)
                        size = response.content_length
                        dSize = ( size / 1024 ) / 1024
                        print dSize,"Mb\n" 
                        File.open("#{title}.#{ext}",'wb') {|file|
                            response.read_body {|segment|
                                alreadyDL += segment.length
                                if(alreadyDL != 0)
                                    aPercent = (alreadyDL * 100) / size
                                    pBar.set(aPercent)
                                end
                                file.write(segment)
                            }
                        pBar.finish
                        }
                    }
                }
            }   
        }
end