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

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


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

المقدمة

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

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

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

مراجع مهمة

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

البحث بالتفصيل

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

تم التعليق على الشفرة التالية جيدًا. لكنني سأصِف الوظائف قليلاً قبل التعمّق في التفاصيل. نقطة البداية لجميع الطلبات هي فئة تُسمى 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() قيمة فارغة. الشيء نفسه بالنسبة إلى السابق، عند الوصول إلى النتيجة الأولى، فإن المكالمة التالية إلى previous() ستعرض null.

لاحظ أن البيانات داخل الخلاصات (مثل الفئات) يتم تضمينها داخل Iterators، لذا يمكنك استخدام الوظائف نفسها للتنقل عبر الفئات المتاحة.

رمز المصدر الكامل

في ما يلي رمز المصدر الكامل لهذا المثال. يمكنك تنزيل ملف zip يحتوي على كل ما تحتاجه لتشغيل مثال داخل Flash Flash الإصدار 3، ولكن من الأفضل تحديث المكتبة في حالة إصلاح الأخطاء أو تحديث الميزات. يمكنك تنزيل المكتبة بالنقر هنا.

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 w/ ActionScript. اطلع على مدونته على blog.martinlegris.com وموقع الويب (يمكن أن يكون قديمًا) على www.newcommerce.ca.

ترخيص Creative Commons
تم منح هذا العمل ترخيصًا بموجب ترخيص Creative Commons Attribution 3.0 في الولايات المتحدة.