Video upload on youtube from rails application
1. Gemfile.lock
gem 'google-api-client', '~> 0.43'
gem 'signet'
gem "image_processing"
gem "oauth2"
gem 'omniauth-oauth2'
gem 'omniauth-google-oauth2'
gem 'google-apis-youtube_v3'
2. config/routes.rb
Rails.application.routes.draw do
get '/auth/:provider/callback', to: 'sessions#google_oauth2_callback'
get '/auth/failure', to: redirect('/')
get '/youtube_session_logout', to: 'sessions#youtube_session_logout'
# Your other routes...
end
3. SessionsController
# app/controllers/sessions_controller.rb
class SessionsController < ApplicationController
def google_oauth2_callback
auth = request.env['omniauth.auth']
# Store tokens in session for future requests
session[:google_token] = auth.credentials.token
session[:google_refresh_token] = auth.credentials.refresh_token if auth.credentials.refresh_token
session[:google_expires_at] = Time.at(auth.credentials.expires_at)
session[:is_youtube] = true
session[:email] = auth.info.email
redirect_to root_path, notice: 'Connected to YouTube!'
end
def youtube_session_logout
youtube_service = YouTubeService.new(session)
# Call the logout method to revoke the token and clear session data
youtube_service.logout(session)
# Optionally, redirect the user to the homepage or a sign-in page
redirect_to root_path, notice: "You have been logged out from YouTube."
end
def failure
redirect_to root_path, alert: "Authentication failed, please try again."
end
end
4. config/initializers/omniauth.rb
# config/initializers/omniauth.rb
Rails.application.config.middleware.use OmniAuth::Builder do
provider :google_oauth2, ENV['GOOGLE_CLIENT_ID'], ENV['GOOGLE_CLIENT_SECRET'], scope: 'userinfo.email, youtube.upload',access_type: 'offline', prompt: 'consent'
# provider :google_oauth2, "#{ENV['GOOGLE_CLIENT_ID']}", "#{ENV['GOOGLE_CLIENT_SECRET']}", scope: 'userinfo.profile,youtube,email', provider_ignores_state: true, prompt: :consent
end
OmniAuth.config.allowed_request_methods = %i[get] #ye line bhi add karna hai isi file me (omniauth.rb)
----------------------------------------------------------------------
5. app/services/you_tube_service.rb
require 'google/apis/youtube_v3'
require 'google/api_client/client_secrets'
class YouTubeService
GOOGLE_REVOKE_TOKEN_URL = 'https://oauth2.googleapis.com/revoke'
def initialize(session)
@service = Google::Apis::YoutubeV3::YouTubeService.new
@service.authorization = Signet::OAuth2::Client.new(
client_id: ENV['GOOGLE_CLIENT_ID'],
client_secret: ENV['GOOGLE_CLIENT_SECRET'],
token_credential_uri: 'https://oauth2.googleapis.com/token',
access_token: session[:google_token],
refresh_token: session[:google_refresh_token],
expires_at: session[:google_expires_at]
)
refresh_token_if_needed(session)
end
def upload_video(file_path, title, description)
begin
video = Google::Apis::YoutubeV3::Video.new(
snippet: {
title: title,
description: description
},
status: {
privacy_status: 'public' # or 'private'
}
)
File.open(file_path, 'rb') do |file|
@service.insert_video('snippet,status', video, upload_source: file, content_type: 'video/*')
end
rescue StandardError => e
Rails.logger.info "****************#{e.message}"
end
end
def logout(session)
revoke_token(session[:google_token])
# Clear session information
session.delete(:google_token)
session.delete(:google_refresh_token)
session.delete(:google_expires_at)
session[:is_youtube] = false
session.delete(:email)
end
private
def refresh_token_if_needed(session)
if @service.authorization.expired?
@service.authorization.refresh!
session[:google_token] = @service.authorization.access_token
session[:google_refresh_token] = @service.authorization.refresh_token
session[:google_expires_at] = @service.authorization.expires_at
end
end
def revoke_token(token)
uri = URI(GOOGLE_REVOKE_TOKEN_URL)
response = Net::HTTP.post_form(uri, { token: token })
unless response.is_a?(Net::HTTPSuccess)
raise "Token revocation failed: #{response.body}"
end
end
end
6. app/views/layouts/application.html.erb
<% if session[:is_youtube] %>
<%= link_to "Logout from YouTube:- #{session[:email]}", youtube_session_logout_path, method: :get %> ||
<span><%= session[:google_expires_at] %></span>
<% else %>
<%= link_to "Connect with YouTube", "/auth/google_oauth2" %>
<% end %>
7. Go to Google
https://accounts.google.com/InteractiveLogin/signinchooser?continue=https%3A%2F%2Fconsole.cloud.google.com%2Fapis%2Fcredentials&followup=https%3A%2F%2Fconsole.cloud.google.com%2Fapis%2Fcredentials&osid=1&passive=1209600&service=cloudconsole&ifkv=ARpgrqdZOpQ_ekvU2Vp4_Id4NGAvDWflX7oG6tg6QEUEx-wmEmFM_lZfTWmv8pO9lpNrtmAhcXFeDw&ddm=1&flowName=GlifWebSignIn&flowEntry=ServiceLogin
7.1. login account
2. Create project
3. Go to API & Services >> Credentials
4. then click "CREATE CREDENTAILS" ye button top center me hai
5. "CREATE CREDENTAILS" click karne ke baad, yaha per apko multiple option show hoge
5.1. API key created >> isko bhi create kar sakte ho requerment ho to
5.2. OAuth client ID >> click on this >> choose "External"
5.3. "OAuth consent screen": isme 1. Application home page me "http://localhost:3000"
2. Add privacy policy
3. Add Authorized Domain: "ebay.com" ye kuchh bhi ho sakta hai
4. Developer contact information: "email.com"
8. Add call bank url
8.1. Goto Credentials >> "OAuth 2.0 Client IDs" >> jis Auth ki ID use kar rhe ho us per click karna hai >> "Authorized redirect URIs" add URI "http://localhost:3000/auth/google_oauth2/callback" >> then save