Tải và upload video tự động lên youtube với youtube-dl và youtube-api - Bài 1 : Giới thiệu về youtube-dl, tải video tự động
Bài đăng này đã không được cập nhật trong 3 năm
Là một lập trình viên, đã bao giờ bạn tìm cách download một video trên youtube mà chẳng cần IDM hay tool nào đại lại thế, hoặc upload chúng lên mà chẳng cần đến giao diện web? Bạn đã bao giờ nghĩ tới việc xây dựng một hệ thống upload video lên youtube theo schedule hay xây dựng bất cứ một trang web nào cung cấp thông tin liên quan tới video trên youtube chưa nhỉ?
Vậy thì hãy ngó qua bài series này của mình để xem cách mình thực hiện những điều trên nhé.
1. Chương trình youtube-dl
youtube-dl là một chương trình dòng lệnh sử dụng để download video từ YouTube và nhiều trang web khác như Instagram , MTV, Soundcloud và Redtube, thậm chí là Facebook và hơn thế nữa... Bạn cũng có thể sử dụng trên window với youtube-dl.exe http://youtube-dl.org/
Để cài đặt nó, các bạn có thể tham khảo chi tiết tại đây https://rg3.github.io/youtube-dl/download.html, Ok. Hãy làm theo cách mà trang https://rg3.github.io/youtube-dl/download.html hướng dẫn cho bạn, dễ như ăn kẹo ấy mà
Xong rồi! Hãy xem 1 vài ví dụ mình sử dụng youtube-dl để tải video ở 1 số trang nhé. (mình sẽ dùng cách đơn gỉan nhất thôi nhé, chi tiết thì bạn tham khảo thêm document của thư viện)
-
Youtube trước nhé Lạc Trôi của Sơn Tùng đang rất hot, mình sẽ thử luôn nhé
youtube-dl "https://www.youtube.com/watch?v=Llw9Q6akRo4"
OK, mạng nhà mình rất khỏe, chỉ trong 4s thôi đã tải xong video 54.22MB này rồi. -
Facebook nhé Một video rất dễ thương trên Beat
youtube-dl https://www.facebook.com/beatvn.page/videos/1289517501085076/
Xong rồi. thử xem có chạy được không nhé. -
SoundCloud nữa nhé
youtube-dl https://soundcloud.com/nguy-n-h-ng-s-n-8/that-tinh-cover
Vân vân và mây mây Bạn hãy tự mình khám phá xem những gì mà youtube-có thể làm được, xem nó có thể download video ở những đâu nữa nhé
2. youtube-dl.rb (Ruby gem)
Với những gì ngon nghẻ mà mình vừa trình bày ở trên, thì mình đã thử ngó qua xem vậy với các ngôn ngữ lập trình, có cái nào tích hợp youtube-dl để mình sử dụng không? Câu trả lời là có đúng như dự đoán. Repository youtube-dl.rb của tài khoản layer8x đã xây dựng gem có tích hợp youtube-dl để cho anh em cộng đồng Ruby sử dụng.
Để cài đặt, sử dụng
gem install youtube-dl.rb
gem 'yt', '~> 0.28.0' # Mình sẽ giải thích về gem này trong bài 2 nhé
Cách sử dụng nó rất đơn giản, ta sử dụng
YoutubeDL.download "https://www.youtube.com/watch?v=Llw9Q6akRo4", output: "video.mp4"
Tham khảo thêm trên Github
3. Sử dụng youtube-dl trong Ruby on Rails Web Application
Ok. Mình sẽ không hướng dẫn cách cài đặt Ruby On Rails, cũng không hướng dẫn bạn cách để tạo 1 trang web với Ruby On Rails nhé. Mặc định mình sẽ coi như những cái đó các bạn đã biết rồi, còn nếu chưa, vui lòng google tham khảo nhé. Ví dụ cách cài đặt https://gorails.com/setup/ubuntu/16.04 Tutorial https://www.railstutorial.org/book
Khai báo với Rails app rằng bạn sử dụng youtune-dl.rb
gem 'youtube-dl.rb'
gem 'yt', '~> 0.28.0' # Mình s
tại terminal đang trở tới thư mục app, chạy
bundle
Thử xem file DownloadsController của mình nhé
class DownloadsController < ApplicationController
def index
end
def new
end
def create
video_url = params[:video_url] # Lấy url từ form gửi lên
video = Yt::Video.new url: video_url # Lấy thông tin video từ url
YoutubeDL.download video_url, output: "videos/#{video.id}" # Lưu video từ url, đặt video vào thư mục video với tên là id của video đó trên youtube
redirect_to downloads_path # Trở về trang index
end
end
File new.html
<div class="row">
<div class="col-md-4 col-md-offset-4">
<form class="form" action="<%= downloads_path %>" method="post">
<div class="form-group">
<label for="video_url">Video URL: </label>
<input type="text" class="form-control" name="video_url" id="video_url">
</div>
<button type="submit" class="btn btn-success">Submit</button>
</form>
</div>
</div>
Nhiệm vụ của trang new này là show ra 1 form với 1 input là url của video Hàm create tiếp nhận và xử lý
4. Sử dụng Sidekiq + Redis chạy Background Job để tải video
Ok. Nếu bạn thử những gì mình hướng dẫn ở trên, bạn sẽ thấy rằng thật phiền phức làm sao nếu như đó là 1 video dài bởi bạn sẽ mất khá nhiều time chờ hàm download xử lý xong để trở về trang index, thậm chí bạn chẳng thể truy cập thêm request nào trong ứng dụụng web của bạn. Vậy thì hãy nghĩ tới việc xử lý download 1 cách bất đồng bộ nhé. Sidekiq, Redis là gì và cài đặt ra sao? Các bạn hãy search thêm trên google nhé. Một tutorial gợi ý cho bạn đây http://railscasts.com/episodes/366-sidekiq
Thêm gem nhé
gem 'sidekiq'
Ok. Tại terminal, chạy
bundle
và
bundle exec sidekiq
để khởi động sidekiq
Xây dựng DownloadWorker như mình nhé
class DownloadsWorker
include Sidekiq::Worker
sidekiq_options queue: "high"
def perform url, name
logger.info "Doing hard work"
Sidekiq.redis { |c| logger.info "redis location: [#{c.client.location }]" }
redis_info = Sidekiq.redis { |conn| conn.info }
logger.info "connected clients: [#{redis_info['connected_clients']}]"
logger.info "hard work was done"
YoutubeDL.download url, output: "videos/#{name}"
end
end
Update lại hàm create của DownloadController
def create
video_url = params[:video_url]
video = Yt::Video.new url: video_url
DownloadsWorker.perform_async video_url, video.id # Chạy hàm perform của DownloadWorker 1 cách bất đồng bộ
redirect_to downloads_path
end
Ok vậy là đã xong. Các bạn thử nhé. Đón xem bài tiếp theo để xem mình upload ra sao. Thanks for your time! Tham thảo sample tại https://github.com/nhs3108/DownUpYoutubeVideo
All rights reserved