Monday, 30 September 2024

Video upload on youtube from rails application

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

Sunday, 29 September 2024

Getting (time ago )Data created_at or updated_at day_ago time

 In the model:


include ActionView::Helpers::DateHelper

def days_ago

    # -----------------------------------------------------

    # if self.uploaded_at

    #   time_ago_in_words(self.uploaded_at) + " ago"

    # else

      # time_ago_in_words(self.created_at) + " ago"

    # end

    # time_diff = Time.current - created_at

    # ----------------------------------------------------

    # if time_diff < 60

    #   "#{time_diff.to_i} seconds ago"

    # else

    #   time_ago_in_words(created_at) + " ago"

    # end

    # ----------------------------------------------------

    time_diff = Time.current - created_at


    if time_diff < 60

      "#{time_diff.to_i} seconds ago"

    elsif time_diff < 3600

      "#{(time_diff / 60).to_i} minutes ago"

    elsif time_diff < 86400

      "#{(time_diff / 3600).to_i} hours ago"

    elsif time_diff < 30.days

      "#{(time_diff / 86400).to_i} days ago"

    elsif time_diff < 1.year

      "#{(time_diff / 1.month).to_i} months ago"

    else

      "#{(time_diff / 1.year).to_i} years ago"

    end

  end


-------------------------------------------------

Console Or Views pages

p = Product.last

p.days_ago