lib/onebox/engine/youtube_onebox.rb in onebox-1.8.68 vs lib/onebox/engine/youtube_onebox.rb in onebox-1.8.69

- old
+ new

@@ -56,107 +56,107 @@ end end private - def video_id - @video_id ||= begin - # http://youtu.be/afyK1HSFfgw - if uri.host["youtu.be"] - id = uri.path[/\/([\w\-]+)/, 1] - return id if id - end - - # https://www.youtube.com/embed/vsF0K3Ou1v0 - if uri.path["/embed/"] - id = uri.path[/\/embed\/([\w\-]+)/, 1] - return id if id - end - - # https://www.youtube.com/watch?v=Z0UISCEe52Y - params['v'] + def video_id + @video_id ||= begin + # http://youtu.be/afyK1HSFfgw + if uri.host["youtu.be"] + id = uri.path[/\/([\w\-]+)/, 1] + return id if id end - end - def list_id - @list_id ||= params['list'] - end - - def list_thumbnail_url - @list_thumbnail_url ||= begin - url = "https://www.youtube.com/oembed?format=json&url=https://www.youtube.com/playlist?list=#{list_id}" - response = Onebox::Helpers.fetch_response(url) rescue "{}" - data = Onebox::Helpers.symbolize_keys(::MultiJson.load(response)) - data[:thumbnail_url] - rescue - nil + # https://www.youtube.com/embed/vsF0K3Ou1v0 + if uri.path["/embed/"] + id = uri.path[/\/embed\/([\w\-]+)/, 1] + return id if id end - end - def video_oembed_data - url = "https://www.youtube.com/oembed?format=json&url=https://www.youtube.com/watch?v=#{video_id}" - response = Onebox::Helpers.fetch_response(url) rescue "{}" - Onebox::Helpers.symbolize_keys(::MultiJson.load(response)) + # https://www.youtube.com/watch?v=Z0UISCEe52Y + params['v'] end + end - def list_oembed_data + def list_id + @list_id ||= params['list'] + end + + def list_thumbnail_url + @list_thumbnail_url ||= begin url = "https://www.youtube.com/oembed?format=json&url=https://www.youtube.com/playlist?list=#{list_id}" response = Onebox::Helpers.fetch_response(url) rescue "{}" - Onebox::Helpers.symbolize_keys(::MultiJson.load(response)) + data = Onebox::Helpers.symbolize_keys(::MultiJson.load(response)) + data[:thumbnail_url] + rescue + nil end + end - def embed_params - p = { 'feature' => 'oembed', 'wmode' => 'opaque' } + def video_oembed_data + url = "https://www.youtube.com/oembed?format=json&url=https://www.youtube.com/watch?v=#{video_id}" + response = Onebox::Helpers.fetch_response(url) rescue "{}" + Onebox::Helpers.symbolize_keys(::MultiJson.load(response)) + end - p['list'] = list_id if list_id + def list_oembed_data + url = "https://www.youtube.com/oembed?format=json&url=https://www.youtube.com/playlist?list=#{list_id}" + response = Onebox::Helpers.fetch_response(url) rescue "{}" + Onebox::Helpers.symbolize_keys(::MultiJson.load(response)) + end - # Parse timestrings, and assign the result as a start= parameter - start = if params['start'] - params['start'] - elsif params['t'] - params['t'] - elsif uri.fragment && uri.fragment.start_with?('t=') - # referencing uri is safe here because any throws were already caught by video_id returning nil - # remove the t= from the start - uri.fragment[2..-1] - end + def embed_params + p = { 'feature' => 'oembed', 'wmode' => 'opaque' } - p['start'] = parse_timestring(start) if start - p['end'] = parse_timestring params['end'] if params['end'] + p['list'] = list_id if list_id - # Official workaround for looping videos - # https://developers.google.com/youtube/player_parameters#loop - # use params.include? so that you can just add "&loop" - if params.include?('loop') - p['loop'] = 1 - p['playlist'] = video_id - end + # Parse timestrings, and assign the result as a start= parameter + start = if params['start'] + params['start'] + elsif params['t'] + params['t'] + elsif uri.fragment && uri.fragment.start_with?('t=') + # referencing uri is safe here because any throws were already caught by video_id returning nil + # remove the t= from the start + uri.fragment[2..-1] + end - URI.encode_www_form(p) + p['start'] = parse_timestring(start) if start + p['end'] = parse_timestring params['end'] if params['end'] + + # Official workaround for looping videos + # https://developers.google.com/youtube/player_parameters#loop + # use params.include? so that you can just add "&loop" + if params.include?('loop') + p['loop'] = 1 + p['playlist'] = video_id end - def parse_timestring(string) - if string =~ /(\d+h)?(\d+m)?(\d+s?)?/ - ($1.to_i * 3600) + ($2.to_i * 60) + $3.to_i - end + URI.encode_www_form(p) + end + + def parse_timestring(string) + if string =~ /(\d+h)?(\d+m)?(\d+s?)?/ + ($1.to_i * 3600) + ($2.to_i * 60) + $3.to_i end + end - def params - return {} unless uri.query - # This mapping is necessary because CGI.parse returns a hash of keys to arrays. - # And *that* is necessary because querystrings support arrays, so they - # force you to deal with it to avoid security issues that would pop up - # if one day it suddenly gave you an array. - # - # However, we aren't interested. Just take the first one. - @params ||= begin - p = {} - CGI.parse(uri.query).each { |k, v| p[k] = v.first } - p - end - rescue - {} + def params + return {} unless uri.query + # This mapping is necessary because CGI.parse returns a hash of keys to arrays. + # And *that* is necessary because querystrings support arrays, so they + # force you to deal with it to avoid security issues that would pop up + # if one day it suddenly gave you an array. + # + # However, we aren't interested. Just take the first one. + @params ||= begin + p = {} + CGI.parse(uri.query).each { |k, v| p[k] = v.first } + p end + rescue + {} + end end end end