كتب هذه المقالة مطوّر خارجي وأرسلها. يشكر فريق واجهات برمجة التطبيقات والأدوات في YouTube "مارتن ليغريس" على وقته وخبرته.
مارتن ليجريس
آذار (مارس) 2008
مقدمة
في هذا الدليل التعليمي، سأوضّح لك كيفية استرداد الفيديوهات الأكثر رواجًا على YouTube خلال آخر day أو week أو month أو all_time باستخدام أقل من 10 أسطر من رمز AS3. ويمكنك الحصول على أيّ من الخلاصات العادية:
- الأكثر مشاهدة
- الأحدث
- الأكثر مناقشة
- الأكثر ارتباطًا
- الأكثر ردودًا
- مميزة مؤخرًا
- الأعلى تقييمًا
- أبرز مقاطع الفيديو المفضلة
- فيديوهات للهواتف الجوّالة
المكتبة المستخدمة في هذا المثال مكتوبة بشكل ثابت طوال الوقت، بمعنى أنه بمجرد استلام البيانات، يمكنك استخدام ميزة الإكمال التلقائي في بيئات IDE مثل FlashDevelop و Flex IDE و Eclipse w/FDT وIntelliJ Idea والمزيد.
موارد مهمة
قبل أن نبدأ، إليك قائمة بالموارد المتاحة لك، أي مطوّر AS3 المهتم باستخدام البيانات من YouTube API.
- مكتبة AS3 التي طوّرتها لتستخدم خدمات الويب هذه
- المستندات الرسمية حول YouTube Data API
- FlashDevelop IDE لـ AS3
- قائمة بالأحداث التي يتم تشغيلها من خلال طلب الطلب الذي تم إجراؤه على YouTubeClient
الاطّلاع على التفاصيل
تقديم طلبك الأول
الكود الذي يليه تم التعليق عليه بشكل جيد إلى حد ما. سأوضّح الوظيفة قليلاً قبل الخوض في التفاصيل. نقطة البداية لجميع الطلبات هي فئة تُسمى 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 باستخدام هذه المكتبة. بما أنّني استغرقت وقتًا طويلاً في كتابة محتوى كل إجابة، أصبح من السهل استكشاف البيانات المتوفّرة في كل إجابة من الردود على الخلاصة. لا تتوفّر وظيفتا الكتابة والتحميل الجديدةَين بعد، ولكن إذا أردت المساهمة في المكتبة، يُرجى الانتقال إلى صفحة المشروع.
السيرة الذاتية للمؤلف
يملك مارتن ليجريس 12 عامًا من الخبرة في مجال تطوير البرامج. يركز "دي بوي" حاليًا بشكل أساسي على أبحاث واجهة المستخدم، وأداته المفضّلة هي Flash مع ActionScript. يمكنك الاطّلاع على مدونته على blog.martinlegris.com وموقعه الإلكتروني (يمكن أن يكون قديمًا) على www.newcommerce.ca.
هذا العمل حائز على
ترخيص Creative Commons Attribution 3.0 في الولايات المتحدة.