diff --git a/web/lib/youtube_client.rb b/web/lib/you_tube_client.rb similarity index 81% rename from web/lib/youtube_client.rb rename to web/lib/you_tube_client.rb index 635aa1a63..cba813844 100644 --- a/web/lib/youtube_client.rb +++ b/web/lib/you_tube_client.rb @@ -1,14 +1,13 @@ require 'faraday' -#require 'thin' require 'launchy' require 'cgi' require 'json' require 'google/api_client' require 'google/api_client/client_secrets' require 'google/api_client/auth/installed_app' -require 'socket' # Provides TCPServer and TCPSocket classes -# require 'youtube_client'; c = YouTubeClient.new -# Youtube API functionality: +require 'socket' + +# Youtube OAuth and API functionality: module JamRuby class YouTubeClient attr_accessor :client @@ -28,13 +27,7 @@ module JamRuby :application_version => '1.0.0' ) - youtube = client.discovered_api('youtube', 'v3') - # client.authorization = nil - # result = client.execute - # :key => config.youtube_developer_key, - # :api_method => youtube.videos.list, - # :parameters => {:id => '', :part => 'snippet'} - # result = JSON.parse(result.data.to_json) + youtube = client.discovered_api('youtube', 'v3') end # Return a login URL that will show a web page with @@ -42,7 +35,6 @@ module JamRuby uri = "https://accounts.google.com/o/oauth2/auth" uri << "?scope=#{CGI.escape('https://www.googleapis.com/auth/youtube https://www.googleapis.com/auth/youtube.upload https://gdata.youtube.com email profile ')}" # # https://www.googleapis.com/auth/youtube https://www.googleapis.com/auth/youtube.upload uri << "&client_id=#{CGI.escape(self.config.google_email)}" - #uri << "&client_secret=#{CGI.escape(self.config.google_secret)}" uri << "&response_type=code" uri << "&access_type=online" uri << "&prompt=consent" @@ -62,6 +54,7 @@ module JamRuby # https://developers.google.com/youtube/v3/guides/using_resumable_upload_protocol def upload_sign(user, filename, length) raise ArgumentError, "Length is required and should be > 0" if length.to_i.zero? + # Something like this: # POST /upload/youtube/v3/videos?uploadType=resumable&part=snippet,status,contentDetails HTTP/1.1 # Host: www.googleapis.com @@ -104,38 +97,24 @@ module JamRuby } conn = Faraday.new(:url =>"https://www.googleapis.com",:ssl => {:verify => false}) do |faraday| - faraday.request :url_encoded - faraday.response :logger - faraday.adapter Faraday.default_adapter + faraday.request :url_encoded + faraday.adapter Faraday.default_adapter end video_json=video_data.to_json - # result = conn.post do |req| - # req.url('/upload/youtube/v3/videos?uploadType=resumable&part=snippet,status') - # req.headers['authorization']="bearer #{(auth.token)}" - # req.headers['content-type']='application/json;charset=utf-8' - # req.headers['x-Upload-Content-Length']="#{length}" - # req.headers['x-upload-content-type']="video/*" - # req.body = video_json - # end - # access_token=#{CGI.escape(auth.token)} result = conn.post("/upload/youtube/v3/videos?access_token=#{CGI.escape(auth.token)}&uploadType=resumable&part=snippet,status,contentDetails", video_json, { - # 'client_id'=>"#{(self.config.google_email)}", - # 'client_secret'=>config.google_secret, - #'Authorization'=>"bearer #{(auth.token)}", 'content-type'=>'application/json;charset=utf-8', 'x-Upload-Content-Length'=>"#{length}", 'x-upload-content-type'=>"video/*" } ) - - #puts result.inspect + # Response should something look like: - # HTTP/1.1 200 OK - # Location: https://www.googleapis.com/upload/youtube/v3/videos?uploadType=resumable&upload_id=xa298sd_f&part=snippet,status,contentDetails - # Content-Length: 0 + # HTTP/1.1 200 OK + # Location: https://www.googleapis.com/upload/youtube/v3/videos?uploadType=resumable&upload_id=xa298sd_f&part=snippet,status,contentDetails + # Content-Length: 0 if (result.nil? || result.status!=200 || result.headers['location'].blank?) msg = "Failed signing with status=#{result.status} #{result.inspect}: " @@ -158,8 +137,6 @@ module JamRuby "Content-Type" => "video/*" } end - - # This has everything one needs to start the upload to youtube: end # https://developers.google.com/youtube/v3/guides/using_resumable_upload_protocol#Check_Upload_Status @@ -178,7 +155,6 @@ module JamRuby 'Content-Length'=> "0", 'Content-Range' => "bytes */#{length}" }) do |response, request, result| - # puts "response: #{response.class}: #{response.code} / #{response.headers} / #{response.body}" # Result looks like this: # 308 Resume Incomplete # Content-Length: 0 @@ -216,6 +192,8 @@ module JamRuby (status_hash['status']>=200 && status_hash['status']<300) end + # Set fully_uploaded if the upload can be verified. + # @return true if verified; false otherwise: def complete_upload(recorded_video) if (verify_upload(recorded_video.user, recorded_video.url, recorded_video.length)) recorded_video.update_attribute(:fully_uploaded, true) @@ -245,12 +223,10 @@ module JamRuby end # Must manually confirm to obtain refresh token: - # 4/ZwtU8nNgiEiu2JlJMrmnnw.Qo7Zys7XjRoZPm8kb2vw2M2j2ZEskgI def get_refresh_token config = Rails.application.config conn = Faraday.new(:url => 'https://accounts.google.com',:ssl => {:verify => false}) do |faraday| - faraday.request :url_encoded - faraday.response :logger + faraday.request :url_encoded faraday.adapter Faraday.default_adapter end @@ -258,7 +234,6 @@ module JamRuby Rails.logger.info("The refresh_token is #{refresh_token}") end - result = conn.get '/o/oauth2/auth', { 'scope'=>'email profile', 'client_id'=>config.google_client_id, @@ -270,17 +245,15 @@ module JamRuby def get_access_token(refresh_token) refresh_token = "4/g9uZ8S4lq2Bj1J8PPIkgOFKhTKmCHSmRe68iHA75hRg.gj8Nt5bpVYQdPm8kb2vw2M23tnRnkgI" - #refresh_token = "4/ZwtU8nNgiEiu2JlJMrmnnw.Qo7Zys7XjRoZPm8kb2vw2M2j2ZEskgI" + config = Rails.application.config conn = Faraday.new(:url => 'https://accounts.google.com',:ssl => {:verify => false}) do |faraday| - faraday.request :url_encoded - faraday.response :logger + faraday.request :url_encoded faraday.adapter Faraday.default_adapter end wait_for_callback do |access_token| - Rails.logger.info("The access_token is #{access_token}") - #self.server.stop() + Rails.logger.info("The access_token is #{access_token}") end result = conn.post '/o/oauth2/token', nil, { @@ -288,9 +261,7 @@ module JamRuby 'client_id'=>config.google_client_id, 'client_secret'=>config.google_secret, 'refresh_token'=>refresh_token, - #'response_type'=>"code", 'grant_type'=>"refresh_token", - #'access_type'=>"offline", 'redirect_uri'=>redirect_uri } @@ -334,19 +305,16 @@ module JamRuby def exchange_for_token(access_code) - #puts "EXCHANGING token for code: [#{access_code}] #{access_code.class}" - + Rails.logger.info("Exchanging token for code: [#{access_code}]") conn = Faraday.new(:url =>"https://accounts.google.com",:ssl => {:verify => false}) do |faraday| faraday.request :url_encoded - # faraday.request :multipart - faraday.response :logger faraday.adapter Faraday.default_adapter end exchange_parms={ 'grant_type'=>'authorization_code', 'code'=>(access_code), - 'client_id'=>(config.google_email),#CGI.escape(config.google_client_id), + 'client_id'=>(config.google_email), 'client_secret'=>(config.google_secret), 'redirect_uri'=>(redirect_uri), } @@ -357,16 +325,12 @@ module JamRuby end body_hash = JSON.parse(result.body) - - #puts "RESULT #{result.body.class}: #{result.body}" - #puts "EXCHANGING for token: [#{body_hash['access_token']}]" body_hash['access_token'] end # shutdown def shutdown() Rails.logger.info("Stopping oauth server...") - #Thread.kill(self.server) if (self.socket) begin self.socket.close @@ -376,11 +340,6 @@ module JamRuby end self.socket = nil end - - # if (self.server) - # Thread.kill(self.server) - # self.server = nil - # end end end # class end # module diff --git a/web/spec/features/oauth_spec.rb b/web/spec/features/oauth_spec.rb index e6c5af5a2..024418400 100644 --- a/web/spec/features/oauth_spec.rb +++ b/web/spec/features/oauth_spec.rb @@ -1,5 +1,5 @@ require 'spec_helper' -require 'youtube_client' +require 'you_tube_client' describe "OAuth", :slow=>true, :js=>true, :type=>:feature, :capybara_feature=>true do diff --git a/web/spec/features/youtube_spec.rb b/web/spec/features/youtube_spec.rb index 41883cd80..48d905df3 100644 --- a/web/spec/features/youtube_spec.rb +++ b/web/spec/features/youtube_spec.rb @@ -1,5 +1,5 @@ require 'spec_helper' -require 'youtube_client' +require 'you_tube_client' require 'rest_client' describe "YouTube", :slow=>true, :js=>true, :type => :feature, :capybara_feature => true do