07/09/2018, 16:09

Tìm hiểu Youtube API Ruby client với gem Fullscreen/yt

Như chúng ta đã biết Youtube là một dịch vụ lưu trữ và chia sẻ video lớn nhất của google hiện nay. Youtube là một kênh hữu hiệu để lưu trữ video khi chúng ta không có điều kiện để thuê host lưu trữ. Youtube API cung cấp đầy đủ api cho phép chúng ta upload và quản lý video. Google mới đây đã ...

YoutubeDataApiV3.png

Như chúng ta đã biết Youtube là một dịch vụ lưu trữ và chia sẻ video lớn nhất của google hiện nay. Youtube là một kênh hữu hiệu để lưu trữ video khi chúng ta không có điều kiện để thuê host lưu trữ.

Youtube API cung cấp đầy đủ api cho phép chúng ta upload và quản lý video. Google mới đây đã phát hành Youtube API v3 giúp việc thao tác quản lý video dễ dàng hơn. Cùng với gem Fullscreen/yt trong Rails cung cấp đầy đủ function để thao tác với youtube thông qua api v3.

Trong bài viết này chúng ta sẽ đi tìm hiểu cơ bản về chức năng Youtube API v3 cung cấp vào thực hiện ứng dụng đơn giản sử dụng Fullscreen/yt để quản lý video.

Các lớp chính trong Fullscreen/yt

  • Yt::Channel: đại diện cho kênh Youtube, khởi tạo thông qua Youtube ID hoặc URL.
  • Yt::Video: đại diện cho video Youtube, khởi tạo thông qua Youtube ID hoặc URL của video
  • Yt::Playlist: đại diện cho playlist Youtube, khởi tạo thông qua Youtube ID hoặc URL của playlist
  • Yt::Account: đại diện cho mỗi tài khoản Youtube, khởi tạo thông qua access_token hoặc refresh_token
  • ...

Ngoài các lớp chính trên Youtube api còn cung cấp các lớp thực hiện việc comment hoặc search...

Tạo ứng dụng đơn giản với Fullscreen/yt

Khởi tạo app

$rails new YTv3 -T

Add gem yt omniauth-google-oauth2 và vào gemfile:

...
gem 'turbolinks'
gem 'yt'
gem 'rails-observers'
gem 'omniauth-google-oauth2'
...

Khởi tạo config cho gem omniauth

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :google_oauth2, Settings.ft.client_id, Settings.ft.client_secret, scope: 'userinfo.profile,youtube'
end

Khởi tạo config cho gem yt

Yt.configure do |config|
  config.client_id = Settings.ft.client_id
  config.client_secret = Settings.ft.client_secret
  config.api_key = Settings.ft.api_key
  config.log_level = :debug
end

Khởi tạo video_controller thực hiện request lấy dữ liệu video và thực hiện upload video

class VideosController < ApplicationController
  def index
    @channel_videos = []
    @channel_titles = []

    Settings.channel.each do |channel|
      ch = Yt::Channel.new id: channel
      videos = ch.videos
      videos = videos.where(published_before: 0.days.ago.utc.iso8601(0), published_after: 1.day.ago.utc.iso8601(0))

      @channel_videos << videos
      @channel_titles << ch.title
    end

  end

  def new
    @video = Video.new
  end

  def create
    if params[:link]
      begin
        video = Yt::Video.new url: params[:link]

        url = "https://www.youtube.com/watch?v=#{video.id}"
        path = "/usr/local/bin/youtube-dl --output " + "'public/yt/" + "#{video.id}.mp4' " + "'" + url + "'"
        system path

        account = Yt::Account.new refresh_token: Settings.ft_refresh_token

        video_file = Dir["public/yt/#{video.id}*"].first.split('/').last

        account.upload_video File.join("public/yt", "#{video_file}"), title: "#{video.title}",
          description: "#{video.description}", tags: video.tags

        File.delete(Rails.root + "public/yt" + "#{video_file}")

        flash[:success] = 'Video added!'
        redirect_to root_url

      rescue => ex
        @video = Video.new
        render :new
      end

    else
      @video = Video.new
      render :new
    end
  end

  private

  def video_params
    params.require(:video).permit(:link)
  end
end

Tạo view videos/index hiển thị video

<div class="container">
  <h2>List video sub in day</h2>

  <% @channel_titles.each_with_index do |titles, index| %>
    <% if @channel_videos[index].any? %>
      <hr>
      <h3><%= titles %></h3>
      <div id="player-wrapper"></div>
      <div class="row">
        <% @channel_videos[index].each do |video| %>
          <% if video %>
            <div class="col-md-2">
              <div class="yt_video thumbnail">
                <%= link_to image_tag("https://img.youtube.com/vi/#{video.id}/mqdefault.jpg", alt: video.title,
                      class: 'img-rounded'),
                      "https://www.youtube.com/watch?v=#{video.id}", target: '_blank' %>
                <div class="caption">
                  <h5><%= video.title %></h5>
                  <% if video.published_at %>
                    <%= video.published_at.strftime('%-d %B %Y %H:%M:%S') %>
                  <% end %>
                  <p>
                  </p>
                </div>
              </div>
            </div>
          <% end %>
        <% end %>
      </div>
    <% end %>
  <% end %>
</div>

Tạo view `videos/new chọn file upload video

<div class="container">
  <h2>Reup Video From URL</h2>

  <%= form_tag videos_path, method: :post do %>
    <div class="form-group">
      <%= label_tag "link" %>
      <%= text_field_tag "link", nil, class: 'form-control' %>
      <span class="help-block">A link to the video on YouTube.</span>
    </div>

    <%= submit_tag "Reup", class: 'btn btn-primary' %>
  <% end %>
</div>

Config router

Rails.application.routes.draw do
  root to: 'videos#index'

  resources :videos, only: [:index, :new, :create]
  resources :playlists, only: [:index, :new, :create]
end

Với các bước trên chúng ta có thể lấy thông tin video từ một channerl thông qua ID channel và hiển thị

Github project: https://github.com/hienbx94/YTv3_tmp

0