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 đã ...
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