ממשק API של נתונים ב-YouTube ל-ActionScript 3.0 : שלבים ראשונים

המאמר הזה נכתב ונשלח על ידי מפתח חיצוני. צוות ממשקי ה-API והכלים של YouTube מודה למרטין לגרי (Martin Legris) על הזמן והמומחיות שלו.


Martin Legris
מרץ 2008

מבוא

במדריך הזה אראה לכם איך אפשר לאחזר את הסרטונים הפופולריים ביותר ב-YouTube ב-day, ב-week, ב-month או ב-all_time האחרונים, באמצעות פחות מ-10 שורות של קוד AS3 בפועל. אפשר לקבל כל אחד מהפידים הרגילים:

  • הנצפים ביותר
  • העדכניים ביותר
  • המוזכרים ביותר
  • המקושרים ביותר
  • עם התגובות הרבות ביותר
  • נבחרו לאחרונה
  • המובילים בדירוג
  • המועדפים המובילים
  • סרטונים לטלפונים ניידים

הספרייה שבה נעשה שימוש בדוגמה הזו היא ספרייה עם טיפוס קבוע לכל אורך הקוד. כלומר, אחרי שתקבלו את הנתונים, תוכלו להשתמש בתכונה של השלמה אוטומטית בסביבות פיתוח משולבות (IDE) כמו FlashDevelop,‏ Flex IDE,‏ Eclipse עם FDT,‏ IntelliJ Idea ועוד.

מקורות מידע חשובים

לפני שנתחיל, הנה רשימת המשאבים שזמינים לך – מפתח/ת AS3 שמעוניין/ת להשתמש בנתונים מ-YouTube API.

הסבר מפורט

שליחת הבקשה הראשונה

הקוד הבא מפורט למדי. עם זאת, לפני שאכנס לפרטים, אסביר קצת על הפונקציונליות. נקודת ההתחלה לכל הבקשות היא מחלקה בשם YouTubeClient. הכיתה הזו היא מופע יחיד (singleton) שאפשר לגשת אליו באופן הבא:

// first you import it
import ca.newcommerce.youtube.webservice.YouTubeClient;

// then you get a reference to it
var client:YouTubeClient = YouTubeClient.getInstance();

עכשיו אנחנו מוכנים לשלוח בקשה:

client.getStandardFeed(YouTubeClient.STD_TOP_RATED, 
                                 YouTubeClient.TIME_MONTH,
                                 1, 
                                 10);

ביקשתי את הסרטונים עם הדירוג הגבוה ביותר בחודש האחרון, התוצאות 1 עד 10 (לתשומת ליבך, יש מגבלה של 50 תוצאות לכל קריאה). קל!

טיפול בתוצאות

עכשיו, איך אפשר לגשת לתוצאות האלה? מכיוון שהפרדיגמה של שירות האינטרנט מסוג REST היא אסינכרונית, קל יותר להשתמש באירועים כדי לטפל בתוצאות במקום להשהות את הקוד בזמן אחזור התוצאות. במקרה כזה, צריך להצהיר על מאזין אירועים לאירוע StandardVideoFeedEvent.STANDARD_VIDEO_DATA_RECEIVED. הפונקציה שלנו תופעל בכל פעם ש-YouTubeClient מקבל תשובה לגבי פיד רגיל.

client.addEventListener(StandardVideoFeedEvent.STANDARD_VIDEO_DATA_RECEIVED, 
                        doVideosReceived);

הפונקציה שתיקרא תהיה doVideosReceived. יש צורך בפרמטר אחד, משתנה מסוג StandardVideoFeedEvent. זה תואם לסטנדרט ב-AS3. נשמח להצהיר על כך, ונתייחס לכמה פרטים הקשורים לסרטונים שקיבלנו. נעבור לפלט הסטנדרטי:

  • שם הסרטון,
  • כתובת ה-URL של קובץ ה-SWF להטמעת הסרטון,
  • מספר הצפיות
  • מספר התגובות,
  • משך הסרטון,
  • ואת שם המחבר.
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);
	}
}

הערות לגבי הספרייה והפידים

כמעט לכל האירועים יש מאפיין .feed. ProfileEvent הוא החריג היחיד, ובמקום זאת יש בו נכס .profile, כי רק רשומה אחת הוחזרה בעקבות הקריאה הזו.

יש סוגים רבים של פידים – כולם מיישמים את השיטות הבאות:

  • first() – אחזור הרשומה הראשונה והפניה אליה
  • next() – אחזור הרשומה הזמינה הבאה
  • last() – אחזור הרשומה האחרונה והפניה אליה
  • previous() – אחזור הרשומה הקודמת בפיד
  • getAt() – אחזור תוצאה במיקום ספציפי
  • count() – מספר התוצאות הזמינות בפיד הזה. הערך הזה לא זהה לערך של totalResults.

כשמגיעים לסוף התוצאות, הפונקציה next() מחזירה null. אותו הדבר לגבי previous. אחרי שמגיעים לתוצאה הראשונה, הקריאה הבאה ל-previous() תחזיר את הערך null.

שימו לב שהנתונים בתוך הפיד (למשל קטגוריות) עטופים ב-Iterators, כך שאפשר להשתמש באותן פונקציות כדי לעבור על הקטגוריות הזמינות.

קוד המקור המלא

בהמשך מופיע קוד המקור המלא של הדוגמה הזו. אתם יכולים להוריד קובץ zip שמכיל את כל מה שדרוש כדי להריץ את הדוגמה ב-Flash CS3. עם זאת, מומלץ לעדכן את הספרייה למקרה שתיקנו באגים או עדכנתם תכונות. אפשר להוריד את הספרייה כאן.

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);
             }

        }

    }

}

סיכום

המאמר הזה רק מתייחס לקצה הקרחון, אבל הוא יעזור לכם להבין כמה קל להריץ שאילתות ל-YouTube Data API באמצעות הספרייה הזו. מכיוון שהקדשתי זמן להקליד את כל הפרטים, קל מאוד לבדוק אילו נתונים זמינים בכל תגובה מהפיד. עדיין אין תמיכה בפונקציות הכתיבה וההעלאה החדשות, אבל אם אתם רוצים לתרום לספרייה, אתם יכולים להיכנס לדף הפרויקט.

ביוגרפיה של המחבר


AUTHORNAME

מרטין לגריס מתגאה בפיתוח תוכנה פעיל במשך 12 שנים. כיום הוא מתרכז בעיקר במחקר על ממשק המשתמש, והכלי האהוב עליו הוא Flash עם ActionScript. אפשר לעיין בבלוג שלו בכתובת blog.martinlegris.com ובאתר שלו (יכול להיות שהמידע בו לא עדכני) בכתובת www.newcommerce.ca.

רישיון Creative Commons
העבודה הזו בשימוש במסגרת רישיון Creative Commons Attribution 3.0 United States.