API Dữ liệu YouTube cho ActionScript 3.0: Các bước đầu tiên

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.

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ẵn
  • last() – 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ệu
  • getAt() – 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ới totalResults

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ả


AUTHORNAME

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.

Giấy phép Creative Commons
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ỳ.