News & Events
Hướng dẫn cách viết class để get link youtube
- 14/04/2016
- Posted by: Bùi Đạt
- Category: Video Bài giảng Video học Lập trình web
Dạo một vòng trên google mình thấy có rất nhiều bạn muốn tìm code để lấy link tải file video từ youtube. Có lẽ vì rất nhiều lý do khác nhau, hiện tại thì cũng có rất nhiều công cụ giúp get link file video của youtube như extension trên Cốc Cốc, Internet Download Manager hay một số phần mềm get link youtube khác..tuy nhiên đó là get link từ client vậy muốn get link từ server phải làm thế nào?
Tuy vậy vẫn còn những lý do khác chẳng hạn như tạo 1 trang chia sẻ video cá nhân, bạn có muốn thêm một chức năng import video Youtube vào không? Chắc chắn là muốn vì nó khá thú vị. Và hôm nay mình sẽ hướng dẫn các bạn làm điều đó.
Bài hôm nay mình sẽ hướng dẫn bạn viết một class mà mình gọi là YoutubeDownloader. Nó có chức năng sau:
1. Get link download từ Youtube với đủ các chất lượng hình ảnh mà video đó hỗ trợ.
API : get_video_info
Youtube có hỗ trợ nhiều API để bạn có thể làm việc với video, tuy nhiên để dùng những API này thì đòi hỏi chúng ta phải đăng ký application mới có thể lấy API Key mà mình cũng không biết rõ hiện tại API nào sẽ hỗ trợ get link trực tiếp cho video. Tuy nhiên khi dùng những API này thì bạn sẽ bị ràng buộc bởi khá nhiều quy định về bản quyền, quyền sở hữu trí tuệ…
Bện cạnh những API đó thì Youtube cũng cung cấp 1 vài API không được mô tả nhiều trên trang tài liệu của Developer. Trong khi đó thì có một API mà chúng ta cần dùng : get_video_info. API này cho phép chúng ta lấy nhiều thông tin về Video, trong đó có chứa link với các định dạng, chất lượng mà video đó hỗ trợ.
Bởi vì không có trong trang tài liệu vì thế API này không được support. Có lẽ cũng không gặp quá nhiều vấn đề về bản quyền mà chỉ là sự suy đoán của cá nhân mình thôi. Quan trọng là API này sẽ hỗ trợ chúng ta lấy link video trực tiếp mà không cần đăng ký bất kì thủ tục nào với Youtube.
Tuy nhiên bù lại với sự tự do này thì ta cũng không hề biết gì về những thay đổi của API này, cũng như không thể biết những giới hạn hay quy định về nó ngoài 1 vài thông tin được cộng đồng chia sẻ. Có lẽ đây chính là API mà các players của Youtube hay dùng.
Để tránh trường hợp xấu ngoài ý muốn các bạn nên xem xét cả quy định dùng API tại Terms of Service.
Endpoint
1 | http://www.youtube.com/get_video_info |
Tham số
- video_id : ID của video
Dữ liệu trả về
Dữ liệu sẽ được trả về dưới dạng text, đã được encode URL. Dữ liệu không phải XML cũng không phải json nên khá là khó xử lý tuy nhiên chúng ta có thể dùng hàm parse_str để tạo ra những biến từ text này.
Trong đống dữ liệu này có 1 số thông tin mà chúng ta cần chú ý :
- title : Tiêu đề video.
- thumbnail_url : URL đến file ảnh thumbnail.
- author : Tên tác giả video.
- url_encoded_fmt_stream_map : Chứa url các định dạng video.
- length_seconds : Thời lượng video
Ưu, nhược điểm
Ưu điểm :
- Dễ dùng không cần đăng ký rườm rà
- Get link video trực tiếp
Nhược điểm :
- Dữ liệu dạng text và không hỗ trợ json, xml
- Link get được có thể sẽ không thể download nếu đem link đó đưa cho một người dùng khác ở một vùng khác với server get link.
Giải pháp
Từ nhược điểm kể trên thì sẽ có 1 vài trường hợp không download được, đó là khi bạn muốn tạo một dịch vụ get link: bạn get link và đưa cho người dùng tải về nhưng người dùng lại nằm ở những khu vực và quốc gia khác với server bạn vừa get thì rất có thể sẽ không tải được. Mình cũng không xác minh được vấn đề này nhưng khả năng xảy ra khá cao.
Để tránh trường hợp này ta cần phải dùng cách tải video từ youtube về server sau đó mới cho người dùng tải file từ server. Hoặc cả server và client đều cùng sử dụng một proxy. Tuy nhiên đây là một cách khá gây tốn tài nguyên vì thế để cân bằng mọi trường hợp thì ta nên cung cấp 2 link. Một là link trực tiếp từ youtube hai là 1 link gián tiếp thông qua server.
Tuy nhiên tốt nhất là không nên cung cấp 1 dịch vụ như vậy nếu dựa vào cách mình hướng dẫn hôm nay vì quá tốn tài nguyên vô ích. Hiện tai có rất nhiều plugin, extension hay phần mềm hỗ trợ get link tại client side. Như thế sẽ không lo bị khác khu vực hay quốc gia.
Ví dụ
Bạn hãy click vào link sau và download một file về rồi mở bằng trình soạn thảo text, file này là những dữ liệu video mà chúng ta cần Demo URL.
Class YoutubeDownloader
Một class đơn giản viết theo Singleton Pattern nhằm phục vụ cho mục đích tìm hiểu và học tập, code này được tham khảo từ project YoutubeDownloader nó bao gồm những phương thức được thực hiện những tính năng lấy link của tất cả những video và chất lượng mà video đó hỗ trợ.
Get nội dung của API
Ta sử dụng CURL để có tốc độ nhanh hơn:
1 2 3 4 5 6 7 8 9 10 | function curlGet($URL) { $ch = curl_init(); $timeout = 3; curl_setopt( $ch , CURLOPT_URL , $URL ); curl_setopt( $ch , CURLOPT_RETURNTRANSFER , 1 ); curl_setopt( $ch , CURLOPT_CONNECTTIMEOUT , $timeout ); $tmp = curl_exec( $ch ); curl_close( $ch ); return $tmp; } |
Cách lấy link download
Như mình đã nói thì API get_video_info sẽ trả về dữ liệu theo dạng URL encoded vì thế để lấy được dữ liệu ta cần dùng hàm parse_str để chuyển tham số trong text thành biến. Về cấu trúc dữ liệu trả về bạn có thể xem qua ví dụ trước.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | public function getLink($id) { $API_URL = self::$endpoint . "?&video_id=" . $id; $video_info = $this->curlGet($API_URL); $url_encoded_fmt_stream_map = ''; parse_str($video_info); if(isset($url_encoded_fmt_stream_map)){ $my_formats_array = explode(',',$url_encoded_fmt_stream_map); } else { return 'No encoded format stream found.'; } if (count($my_formats_array) == 0) { return 'No format stream map found - was the video id correct?'; } $avail_formats[] = ''; $i = 0; $ipbits = $ip = $itag = $sig = $quality = $type = $url = ''; $expire = time(); foreach($my_formats_array as $format) { parse_str($format); $avail_formats[$i]['itag'] = $itag; $avail_formats[$i]['quality'] = $quality; $type = explode(';',$type); $avail_formats[$i]['type'] = $type[0]; $avail_formats[$i]['url'] = urldecode($url) . '&signature=' . $sig; parse_str(urldecode($url)); $avail_formats[$i]['expires'] = date("G:i:s T", $expire); $avail_formats[$i]['ipbits'] = $ipbits; $avail_formats[$i]['ip'] = $ip; $i++; } return $avail_formats; } |
Phương thức này sẽ trả về 1 mảng những link trực tiếp tới các file có chất lượng khác nhau mà video đó hỗ trợ.
Cách dùng
Để dùng class bạn gọi nó như sau:
1 2 3 4 5 6 | require_once 'YoutbeDownloader.php'; $qualitys = YoutbeDownloader::getInstance()->getLink('ql3cZuSwiE8'); foreach($qualitys as $video) { echo "<a href='" . $video['url'] . "'>" . $video['quality'] . "-" . $video['type'] . "</a></br>"; } |
Ngoài ra, nếu như bạn muốn lưu về server thì bạn có thể dùng hàm file_put_contents, fwrite.
Những class tương tự
- Youtube downloader : Bài hướng dẫn này tham khảo nhiều từ project này..
Lời kết
Việc getlink để download video youtube bằng php và chạy trên server này không thích hợp với việc tạo dịch vụ để get link cho người dùng bởi hiện tại có quá nhiều phần mềm client-side làm giúp bạn điều đó và các phần mềm này cũng nhanh hơn việc chạy trên serverside rất nhiều. Chúc các bạn thành công!
Trả lời Hủy
Website này sử dụng Akismet để hạn chế spam. Tìm hiểu bình luận của bạn được duyệt như thế nào.