2011-09-21 4 views
12

나는 그것을 구문 분석하는 API에서 JSON 데이터를 가져 오는 레이크 작업이 없습니다, 데이터베이스에 저장 : 나는 레이크 작업을 실행할 때 내가 스택 추적에서이 오류가레이크 작업에서 열린 uri 오류 404 ... 원인은 무엇입니까?

task :embedly => :environment do 
    require 'json' 
    require 'uri' 
    require 'open-uri' 

    Video.all.each do |video| 
    json_stream = open("http://api.embed.ly/1/oembed?key=08b652e6b3ea11e0ae3f4040d3dc5c07&url=#{video.video_url}&maxwidth=525") 
    ruby_hash = JSON.parse(json_stream.read) 
    thumbnail_url = ruby_hash['thumbnail_url'] 
    embed_code = ruby_hash['html'] 
    video.update_attributes(:thumbnail_url => thumbnail_url, :embed_code => embed_code) 
    end 
end 

나는 더이 아이디어는 무엇을 일으키는 :

rake aborted! 
404 Not Found 
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:277:in `open_http' 
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:616:in `buffer_open' 
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:164:in `open_loop' 
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:162:in `catch' 
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:162:in `open_loop' 
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:132:in `open_uri' 
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:518:in `open' 
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:30:in `open' 
/rubyprograms/dreamstill/lib/tasks/tasks.rake:16 
/rubyprograms/dreamstill/lib/tasks/tasks.rake:15:in `each' 
/rubyprograms/dreamstill/lib/tasks/tasks.rake:15 
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:636:in `call' 
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:636:in `execute' 
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:631:in `each' 
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:631:in `execute' 
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:597:in `invoke_with_call_chain' 
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/monitor.rb:242:in `synchronize' 

문제에 대한 아이디어 및 해결 방법은 무엇입니까?

답변

20

embed.ly api는 지정된 리소스 (비디오/그림)가없는 경우 404를 반환합니다. OpenURI는 이것을 예외로 처리합니다. 오류를 잡으려면 다음과 같이 할 수 있습니다.

task :embedly => :environment do 
    require 'json' 
    require 'uri' 
    require 'open-uri' 

    Video.all.each do |video| 
    begin 
     json_stream = open("http://api.embed.ly/1/oembed?key=08b652e6b3ea11e0ae3f4040d3dc5c07&url=#{video.video_url}&maxwidth=525") 
     ruby_hash = JSON.parse(json_stream.read) 
     thumbnail_url = ruby_hash['thumbnail_url'] 
     embed_code = ruby_hash['html'] 
     video.update_attributes(:thumbnail_url => thumbnail_url, :embed_code => embed_code) 
    rescue OpenURI::HTTPError => ex 
     puts "Handle missing video here" 
    end 
    end 
end 

작업을 실행하기 전에 동영상/URL이 유효한지 확인할 수도 있습니다.

+0

나는 404의 URL을 인쇄 할 수있는 방법에 어떤 생각? – lulalala

1

당신은 인코딩 URL이 아닙니다있어 당신의 video.url :

json_stream = open("...url=#{video.video_url}...") 

그래서 당신은 아마 엉망이 URL을 생산하고 있으며 api.embed.ly이 그것을 찾을 수 있음을 말하고있다. 예를 들어 video.video_urlhttp://a.b?c=d&e=f 인 경우 e=fhttp://a.b으로 전달되는 대신 http://api.embed.ly/1/oembed의 매개 변수로 표시됩니다.

대신이 작업을 수행 할 수 있습니다 :

require 'cgi' 
#... 
json_stream = open("...url=#{CGI.escape(video.video_url)}...") 
관련 문제