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

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

Github của youtube-dl tại

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

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