YouTube Data API للإصدار 3.0 من ActionScript : الخطوات الأولى

كتب هذه المقالة مطوّر خارجي وأرسلها. يشكر فريق واجهات برمجة التطبيقات والأدوات في YouTube "مارتن ليغريس" على وقته وخبرته.


مارتن ليجريس
آذار (مارس) 2008

مقدمة

في هذا الدليل التعليمي، سأوضّح لك كيفية استرداد الفيديوهات الأكثر رواجًا على YouTube خلال آخر day أو week أو month أو all_time باستخدام أقل من 10 أسطر من رمز AS3. ويمكنك الحصول على أيّ من الخلاصات العادية:

  • الأكثر مشاهدة
  • الأحدث
  • الأكثر مناقشة
  • الأكثر ارتباطًا
  • الأكثر ردودًا
  • مميزة مؤخرًا
  • الأعلى تقييمًا
  • أبرز مقاطع الفيديو المفضلة
  • فيديوهات للهواتف الجوّالة

المكتبة المستخدمة في هذا المثال مكتوبة بشكل ثابت طوال الوقت، بمعنى أنه بمجرد استلام البيانات، يمكنك استخدام ميزة الإكمال التلقائي في بيئات IDE مثل FlashDevelop و Flex IDE و Eclipse w/FDT وIntelliJ Idea والمزيد.

موارد مهمة

قبل أن نبدأ، إليك قائمة بالموارد المتاحة لك، أي مطوّر AS3 المهتم باستخدام البيانات من YouTube API.

الاطّلاع على التفاصيل

تقديم طلبك الأول

الكود الذي يليه تم التعليق عليه بشكل جيد إلى حد ما. سأوضّح الوظيفة قليلاً قبل الخوض في التفاصيل. نقطة البداية لجميع الطلبات هي فئة تُسمى YouTubeClient. هذه الفئة هي فئة فردية يمكنك الوصول إليها باتّباع الخطوات التالية:

// 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()".

تجدر الإشارة إلى أنّ البيانات داخل الخلاصات (مثل الفئات) تكون مضمّنة في 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 Attribution 3.0 في الولايات المتحدة.