class Bilibili::Video
bilibili video interfaces
Public Instance Methods
download_video_by_bv(bv_id, options)
click to toggle source
# File lib/bilibili_console/video.rb, line 80 def download_video_by_bv(bv_id, options) urls = video_url_list(bv_id, options[:qn]) return nil if urls.empty? urls = page_slice(urls, options[:start], options[:end], options[:page]) download_path = "#{File.expand_path(@options['download_path'].to_s, __dir__)}/#{bv_id}/" url_array = [] urls.map { |url| download_file(url, download_path) }.each_with_index do |u, i| same_part = same_part?(u, i) url_array << u[:file_path] combine_media(url_array, "#{download_path}#{u[:prefix]}.flv") unless same_part end end
get_video_url(bv_id, cid, video_qn = '720')
click to toggle source
# File lib/bilibili_console/video.rb, line 58 def get_video_url(bv_id, cid, video_qn = '720') qn = BilibiliBase.video_qn[video_qn] url = "#{Api::Video::PLAY_URL}?bvid=#{bv_id}&cid=#{cid}&qn=#{qn}&fnval=0&fnver=0&fourk=1" data = get_jsona(url) data[:durl] end
video_page_list(bv_id)
click to toggle source
# File lib/bilibili_console/video.rb, line 46 def video_page_list(bv_id) return nil if bv_id.nil? url = "#{Api::Video::PAGE_LIST}?bvid=#{bv_id}" datas = get_jsona(url) return nil if datas.nil? datas.map do |d| Bilibili::PageInfo.new(d) end end
video_url_list(bv_id, video_qn = '720')
click to toggle source
# File lib/bilibili_console/video.rb, line 65 def video_url_list(bv_id, video_qn = '720') result = [] page_list = video_page_list(bv_id) return nil if page_list.nil? page_list.each do |page| get_video_url(bv_id, page.cid, video_qn).each do |down_url| order = down_url[:order] < 10 ? "0#{down_url[:order]}" : down_url[:order] result << { 'name': "#{page.part}_#{order}.flv", 'url': down_url[:url].to_s, 'prefix': page.part, 'order': "#{page.page}#{order}", 'bv': bv_id.to_s } end end result end
Private Instance Methods
check_path(dir, filename)
click to toggle source
# File lib/bilibili_console/video.rb, line 129 def check_path(dir, filename) FileUtils.mkdir_p(dir) unless Dir.exist?(dir) "#{dir}#{filename}" end
combine_media(files, dest)
click to toggle source
# File lib/bilibili_console/video.rb, line 150 def combine_media(files, dest) return if files.size.zero? if files.size == 1 FileUtils.mv(files[0], dest) files.clear return end return if files.select! { |file| File.exist?(file) }.size.zero? `ffmpeg -i concat:"#{files.join('|')}" -c copy #{dest}` files.clear end
dest_file_exist?(dest)
click to toggle source
# File lib/bilibili_console/video.rb, line 165 def dest_file_exist?(dest) if File.exist?(dest) local = File.new(dest).size raise 'file size is zero' if local.zero? true else false end end
download_file(url, dir)
click to toggle source
# File lib/bilibili_console/video.rb, line 119 def download_file(url, dir) file_path = check_path(dir, url[:name]) url[:file_path] = file_path puts "开始下载文件到: #{file_path}, 视频地址:#{url[:url]}" headers = generate_headers wget_download(url[:url], headers['User-Agent'], headers['Referer'], headers['Cookie'], file_path) dest_file_exist?(file_path) url end
generate_headers()
click to toggle source
# File lib/bilibili_console/video.rb, line 141 def generate_headers headers = BiliHttp.headers { 'User-Agent' => headers[:"User-Agent"], 'Referer' => headers[:Referer], 'Cookie' => create_cookie_str(load_cookie) } end
next?(array, index)
click to toggle source
# File lib/bilibili_console/video.rb, line 111 def next?(array, index) !array[index + 1].nil? end
page_slice(urls, start_page, end_page, page)
click to toggle source
# File lib/bilibili_console/video.rb, line 96 def page_slice(urls, start_page, end_page, page) if page.nil? start_page = start_page.to_i - 1 if end_page.nil? urls.slice(start_page, urls.size - start_page) elsif start_page < end_page.to_i urls.slice(start_page, end_page.to_i) else raise 'start should not less than or equals to end' end else [] << urls[page.to_i - 1] end end
same_part?(array, idx)
click to toggle source
# File lib/bilibili_console/video.rb, line 115 def same_part?(array, idx) next?(array, idx) && array[idx][:prefix] == array[idx + 1][:prefix] end
wget_download(url, user_agent, referer, cookie, dest)
click to toggle source
# File lib/bilibili_console/video.rb, line 186 def wget_download(url, user_agent, referer, cookie, dest) config_path = File.expand_path((@options['config_path']).to_s, __dir__) File.write("#{config_path}/cookie", cookie) unless File.exist?("#{config_path}/cookie") command = "wget '#{url}' --referer '#{referer}' --user-agent '#{user_agent}' --load-cookie='#{config_path}/cookie' " `#{command} -c -O "#{dest}"` end
wget_file_size(command)
click to toggle source
# File lib/bilibili_console/video.rb, line 176 def wget_file_size(command) result = `#{command} -o -` hash = {} result.split("\n").filter { |n| n.include?(':') }.each do |line| a = line.split(':') hash[a[0].strip] = a[1].strip end hash['Content-Length'].to_i end