Bài viết này do một nhà phát triển bên ngoài viết và gửi. Nhóm phụ trách API và Công cụ của YouTube cảm ơn Martin Leris đã dành thời gian và chia sẻ kiến thức chuyên môn của anh.
Martin Legris
Tháng 3 năm 2008
Giới thiệu
Trong hướng dẫn này, tôi sẽ hướng dẫn bạn cách truy xuất các video phổ biến nhất trên YouTube trong day, week, month hoặc all_time gần nhất bằng chưa đến 10 dòng mã AS3 thực tế. Bạn có thể nhận bất kỳ nguồn cấp dữ liệu tiêu chuẩn nào:
- Được xem nhiều nhất
- Gần đây nhất
- Được thảo luận Nhiều nhất
- Được liên kết Nhiều nhất
- Được phản hồi Nhiều nhất
- Nổi bật Gần đây
- Có điểm xếp hạng cao nhất
- Được yêu thích nhất
- Video dành cho điện thoại di động
Thư viện dùng trong ví dụ này được nhập cứng xuyên suốt, nghĩa là sau khi nhận được dữ liệu, bạn có thể sử dụng tính năng tự động hoàn thành trong các IDE như FlashDevelop, Flex IDE, Eclipse w/FDT, IntelliJ Idea, v.v.
Tài nguyên quan trọng
Trước khi bắt đầu, đây là danh sách tài nguyên dành cho bạn – nhà phát triển AS3 muốn sử dụng dữ liệu từ API YouTube.
- Thư viện AS3 mà tôi phát triển để sử dụng các dịch vụ web này
- Tài liệu chính thức về API Dữ liệu của YouTube
- FlashDevelop IDE cho AS3
- Danh sách các sự kiện được kích hoạt theo lệnh gọi yêu cầu được thực hiện trên YouTubeClient
Tìm hiểu sâu
Tạo yêu cầu đầu tiên
Đoạn mã theo sau được nhận xét khá rõ ràng. Tuy nhiên, tôi sẽ mô tả một chút về chức năng này trước khi đi sâu vào. Điểm xuất phát cho tất cả các yêu cầu là một lớp có tên là YouTubeClient. Lớp này là một singleton mà bạn có quyền truy cập vào bằng cách thực hiện các thao tác sau:
// first you import it import ca.newcommerce.youtube.webservice.YouTubeClient; // then you get a reference to it var client:YouTubeClient = YouTubeClient.getInstance();
Bây giờ, chúng ta đã sẵn sàng gửi yêu cầu:
client.getStandardFeed(YouTubeClient.STD_TOP_RATED,
YouTubeClient.TIME_MONTH,
1,
10);Tôi vừa yêu cầu các video được xếp hạng cao nhất trong tháng trước, kết quả từ 1 đến 10 (lưu ý rằng chỉ có tối đa 50 kết quả cho mỗi lệnh gọi). Dễ thôi!
Xử lý kết quả
Bây giờ, làm cách nào để tôi truy cập vào những kết quả này? Vì mô hình dịch vụ web loại REST là không đồng bộ, nên bạn nên sử dụng các sự kiện để xử lý kết quả thay vì tạm dừng mã trong khi kết quả được tìm nạp. Trong trường hợp này, chúng ta cần khai báo trình nghe sự kiện cho sự kiện StandardVideoFeedEvent.STANDARD_VIDEO_DATA_RECEIVED. Hàm của chúng ta sẽ được gọi mỗi khi YouTubeClient nhận được phản hồi cho Nguồn cấp dữ liệu chuẩn.
client.addEventListener(StandardVideoFeedEvent.STANDARD_VIDEO_DATA_RECEIVED,
doVideosReceived);
Hàm sẽ được gọi là doVideosReceived. Phương thức này sẽ nhận một tham số, một biến thuộc loại StandardVideoFeedEvent. Điều này tuân theo tiêu chuẩn trong AS3. Hãy khai báo biến này và theo dõi một vài thông tin liên quan đến video mà chúng ta nhận được. Chúng ta sẽ theo dõi dữ liệu đầu ra chuẩn:
- tiêu đề của video,
- URL của SWF để nhúng video,
- số lượt xem,
- số lượng bình luận,
- thời lượng video,
- và tên tác giả.
function doVideosReceived(evt:StandardVideoFeedEvent):void
{
// get a reference to the feed containing the videos
var feed:VideoFeed = evt.feed;
// variable to hold each video retreived on the feed
var video:VideoData;
// iterate through the availabe results
while(video = feed.next())
{
// trace a newline followed by the video title
trace("\nvideo title:"+video.title);
// trace the url to use to embed the flash player with this video playing in it..
trace("player url:"+video.swfUrl);
// the view count
trace("viewCount:"+video.viewCount);
// the comment count
trace("commentCount:"+video.commentCount);
// the duration
trace("duration:"+video.duration);
// the author
trace("author:"+video.authors.first().name);
}
}Một vài lưu ý về thư viện và nguồn cấp dữ liệu
Hầu hết các sự kiện đều có thuộc tính .feed. ProfileEvent là một ngoại lệ, thuộc tính này có một thuộc tính .profile, vì lệnh gọi này chỉ trả về một bản ghi.
Có nhiều loại nguồn cấp dữ liệu – tất cả đều triển khai các phương thức sau:
first()-- truy xuất bản ghi đầu tiên và trỏ vào bản ghi đónext()– truy xuất bản ghi tiếp theo có sẵnlast()– truy xuất bản ghi gần đây nhất và trỏ đến bản ghi đóprevious()-- truy xuất bản ghi trước đó trên nguồn cấp dữ liệugetAt()– nhận kết quả tại một vị trí cụ thểcount()– số lượng kết quả có sẵn cho nguồn cấp dữ liệu này, không giống vớitotalResults
Khi bạn xem kết quả cuối cùng, next() sẽ trả về giá trị rỗng. Tương tự như trước, sau khi bạn nhận được kết quả đầu tiên, lệnh gọi tiếp theo đến previous() sẽ trả về null.
Xin lưu ý rằng dữ liệu bên trong nguồn cấp dữ liệu (ví dụ: danh mục) được gói bên trong Iterators, vì vậy, bạn có thể sử dụng các hàm tương tự để xem qua các danh mục hiện có.
Mã nguồn hoàn chỉnh
Sau đây là mã nguồn đầy đủ cho ví dụ này. Bạn có thể tải tệp zip chứa mọi thứ cần thiết để chạy ví dụ bên trong Flash CS3. Tuy nhiên, tốt nhất bạn nên cập nhật thư viện trong trường hợp chúng tôi khắc phục lỗi hoặc cập nhật tính năng. Bạn có thể tải thư viện xuống bằng cách nhấp vào đây.
package
{
// first import dependencies (You can be more specific than this if you want)
import ca.newcommerce.youtube.data.*;
import ca.newcommerce.youtube.events.*;
import ca.newcommerce.youtube.feeds.*;
import ca.newcommerce.youtube.iterators.*;
import ca.newcommerce.youtube.webservice.YouTubeClient;
public class ytTest()
{
// some class variables
protected var _ws:YouTubeClient;
protected var _requestId:Number;
public function ytTest()
{
// now inside of an init function
_ws = YouTubeClient.getInstance();
// register to list to the events you are interested in
_ws.addEventListener(StandardVideoFeedEvent.STANDARD_VIDEO_DATA_RECEIVED, doVideosReceived);
// do your call.. get the Top Rated videos for the last month
// results 1 to 10; it returns a requestId
_requestId = _ws.getStandardFeed(YouTubeClient.STD_TOP_RATED,
YouTubeClient.TIME_MONTH,
1,
10);
}
protected function doVideosReceived(evt:StandardVideoFeedEvent):void
{
// get a reference to the feed containing the videos
var feed:VideoFeed = evt.feed;
// variable to hold each video retrieved on the feed
var video:VideoData;
while(video = feed.next())
{
// trace a newline followed by the video title
trace("\nvideo title:"+video.title);
// trace the swf URL (used for embedding)
trace("player url:"+video.swfUrl);
// the view count
trace("viewCount:"+video.viewCount);
// the comment count
trace("commentCount:"+video.commentCount);
// the duration
trace("duration:"+video.duration);
// the author
trace("author:"+video.authors.first().name);
}
}
}
}
Kết luận
Mặc dù chỉ đề cập đến một phần nhỏ trong số các tính năng, nhưng bài viết này sẽ giúp bạn hiểu rõ cách truy vấn YouTube Data API bằng thư viện này một cách đơn giản. Vì tôi đã dành thời gian để nhập mọi thứ, nên bạn có thể dễ dàng khám phá dữ liệu có sẵn trên mỗi phản hồi của nguồn cấp dữ liệu. Thư viện này chưa hỗ trợ chức năng ghi và tải lên mới, nhưng nếu bạn muốn đóng góp cho thư viện, hãy truy cập vào trang dự án.
Tiểu sử tác giả
Martin Legris có 12 năm kinh nghiệm phát triển phần mềm. Hiện tại, ông chủ yếu tập trung vào nghiên cứu giao diện người dùng và công cụ yêu thích của ông là Flash w/ ActionScript. Hãy xem blog của anh tại blog.martinlegris.com và trang web (có thể đã lỗi thời) tại www.newcommerce.ca.
Tác phẩm này được cấp phép theo
Giấy phép Ghi công theo Creative Commons 3.0 của Hoa Kỳ.