78 lines
1.4 KiB
Ruby
Executable file
78 lines
1.4 KiB
Ruby
Executable file
#!/usr/bin/env ruby
|
|
|
|
require 'cgi'
|
|
require 'faraday'
|
|
require 'rack'
|
|
require 'uri'
|
|
|
|
def main
|
|
while youtube_url = ARGV.shift
|
|
puts ">>> Snarfing audio from #{youtube_url}..."
|
|
if YouTubeSnarfer.snarf(youtube_url)
|
|
sleep 60
|
|
end
|
|
end
|
|
end
|
|
|
|
class YouTubeSnarfer
|
|
|
|
attr_reader :url, :video_filename
|
|
|
|
def self.snarf(url)
|
|
new(url).snarf
|
|
end
|
|
|
|
def initialize(url)
|
|
@url = url
|
|
unless @url =~ /^http/
|
|
@url = "http://youtube.com/watch?v=#{@url}"
|
|
end
|
|
end
|
|
|
|
def snarf
|
|
encode_audio
|
|
end
|
|
|
|
def title
|
|
video_filename.sub(/\s*-\w+.mp4\s*$/, '')
|
|
end
|
|
|
|
def audio_filename
|
|
"#{title}.m4a"
|
|
end
|
|
|
|
def encode_audio
|
|
save_video
|
|
if File.exists?(audio_filename)
|
|
puts ">>> Skipping, #{audio_filename} already exists. Delete it if you want to re-extract the audio."
|
|
return false
|
|
end
|
|
cmd = "ffmpeg -i '#{video_filename}' -vn -acodec copy '#{audio_filename}'"
|
|
IO.popen(cmd) do |io|
|
|
io.each_line do |line|
|
|
puts line
|
|
end
|
|
end
|
|
true
|
|
end
|
|
|
|
def save_video
|
|
IO.popen("youtube-dl #{url}") do |io|
|
|
io.each_line do |line|
|
|
puts line
|
|
|
|
if line =~ /^\[download\] /
|
|
@video_filename =
|
|
if line =~ /Destination:/
|
|
line.split(': ').last
|
|
else
|
|
line.sub('[download] ', '').sub(' has already been downloaded', '')
|
|
end.sub(/[\s\r\n]*$/, '')
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
main if $0 == __FILE__
|