jam-cloud/web/lib/utils.rb

95 lines
2.8 KiB
Ruby

class Utils
RECORDING_SRC_PREFIX = 'rec_'
RECORDING_SOURCES = ["#{RECORDING_SRC_PREFIX}youtube", "#{RECORDING_SRC_PREFIX}soundcloud"]
USERNAME_SITES = %W{youtube facebook soundcloud bandcamp fandalism twitter reverbnation}
SITE_TYPES = ['url'].concat(USERNAME_SITES).concat(RECORDING_SOURCES)
USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.1 Safari/537.36"
def self.recording_source?(site)
RECORDING_SOURCES.include?(site)
end
def self.extract_recording_id(site, recording_url)
recording_url.strip!
case site
when 'rec_youtube'
# regex derived from: https://gist.github.com/afeld/1254889
if recording_url =~ /(youtu.be\/|youtube.com\/(watch\?(.*&)?v=|(embed|v)\/))([^\?&\"\'>]+)/
return $5
end
when 'rec_soundcloud'
if recording_url =~ /^https?:\/\/.*soundcloud.com\/.+/
tmpfile = Tempfile.new(site)
tmpfile.close
curl_args = "-A '#{USER_AGENT}' -L --output #{tmpfile.path} --fail --show-error "
`curl #{curl_args} '#{recording_url}' 2>&1`
result = File.read(tmpfile.path)
File.delete(tmpfile.path)
if result =~ /"soundcloud:\/\/sounds:(\d+)"/
return $1
end
end
end
nil
end
def self.username_url(username, site)
case site
when 'youtube'
"https://www.youtube.com/c/#{username}"
when 'facebook'
"https://www.facebook.com/#{username}"
when 'soundcloud'
"https://soundcloud.com/#{username}"
when 'bandcamp'
"http://#{username}.bandcamp.com"
when 'bandcamp-fan'
"http://bandcamp.com/#{username}"
when 'fandalism'
"http://fandalism.com/#{username}"
when 'twitter'
"https://twitter.com/#{username}"
when 'reverbnation'
"http://www.reverbnation.com/#{username}"
else
nil
end
end
def self.site_validator(url, site=nil)
curl_args = "-A '#{USER_AGENT}' --silent --head --fail --show-error "
case site
when 'bandcamp'
cmd = "curl #{curl_args} '#{url}' 2>&1"
result = `#{cmd}`.chomp
if $?.success?
if /^HTTP\/\d+\.\d+ 2\d\d OK/ =~ result.lines[0]
return nil
else
if /http:\/\/(.*)\.bandcamp.com/ =~ url
return self.site_validator(self.username_url($1, 'bandcamp-fan'), 'bandcamp-fan')
end
return "Unrecognized url (#{url})"
end
else
result =~ /curl: \(\d+\) (.*)/
return "#{$1} (#{url})"
end
else
curl_args << "-L --output /dev/null "
cmd = "curl #{curl_args} '#{url}' 2>&1"
result = `#{cmd}`.chomp
end
if $?.success?
return nil
else
result =~ /curl: \(\d+\) (.*)/
return "#{$1} (#{url})"
end
end
end