lib/freshlive.rb in rget-4.6.0 vs lib/freshlive.rb in rget-4.6.1

- old
+ new

@@ -12,23 +12,29 @@ each_programs(Nokogiri(open(archive).read)) do |meta| begin serial = meta['data']['title'].scan(/\d+$/).first.to_i src = "#{@label}##{'%02d' % serial}.ts" - dst = src.sub(/\.ts$/, '.mp4') + dst = src.sub(/\.ts$/, @options.mp3 ? '.mp3' : '.mp4') if exist?(dst) puts "#{dst} is existent, skipped." return end - open(src, 'wb') do |w| - print "getting #{src}..." - ts_list(meta['data']['archiveStreamUrl']).each do |u| - print '.' - w.write(open(u, 'rb').read) + unless exist?(src) + open(src, 'wb') do |w| + print "getting #{src}..." + ts_list(meta['data']['archiveStreamUrl']).each_with_index do |u, i| + print '.' if i % 50 == 0 + w.write(open(u, 'rb').read) + end end end - dst = mp4nize(src) + if @options.mp3 + dst = to_mp3(src) + else + dst = to_mp4(src) + end puts 'done.' move(dst) return rescue OpenURI::HTTPError puts 'try next.' @@ -67,11 +73,11 @@ end end private def each_programs(html) - x = "//section[h1[contains(text(),'アーカイブ')]]//*[contains(@class,'ProgramTitle')]/a/@href" + x = "//section[descendant::h1[contains(text(),'アーカイブ')]]//*[contains(@class,'ProgramTitle')]/a/@href" html.xpath(x).each do |href| id = Pathname(href.value).basename.to_s yield JSON.parse(open("https://freshlive.tv/proxy/Programs;id=#{id}", &:read)) end end @@ -79,12 +85,24 @@ def ts_list(rate_m3u8) ts_m3u8 = open(rate_m3u8).read.each_line.grep_v(/^#/)[1].chomp open(URI(rate_m3u8) + ts_m3u8).read.each_line.grep_v(/^#/).map{|u|URI(rate_m3u8) + u.chomp} end - def mp4nize(src) + def to_mp3(src) + dst = src.sub(/ts$/, 'mp3') + command = "ffmpeg -i '#{src}' -vn -ab 64k '#{dst}'" + result = Open3.capture3(command) + if result[2].to_i == 0 + File.delete(src) + else + File.delete(dst) if File.exist?(dst) + end + return dst + end + + def to_mp4(src) dst = src.sub(/ts$/, 'mp4') - command = "ffmpeg -i #{src} -vcodec copy -strict -2 #{dst}" + command = "ffmpeg -i '#{src}' -vcodec copy -strict -2 '#{dst}'" result = Open3.capture3(command) if result[2].to_i == 0 File.delete(src) else File.delete(dst) if File.exist?(dst)