ا هو الـ API ؟
الـ API هو اختصار لـ Application Programming Interface كما يعرف اغلب المبرمجين
وأحد اكثر الامثلة وضوحا والتى قرأتها من قبل فى احد ألإجابات عن هذا السؤال لتبسيط فكرة الـ API كانت بتشبيه الـ API بالنادل الموجود بالمطعم (الجرسون ( Waiter
حيث أنك كمستهلك أو عميل تذهب الى المطعم وتجلس على الطاولة ولديك قائمة الطعام تختار ما تريد وتخبر النادل انك تريد كذا وكذا يقوم هو بالاستجابة لطلبك وتوصيل هذا الطلب الى المطبخ ثم يجلب لك ما قمت بطلبه ويقوم بتقديمه اليك فعندما نتحدث عن Facebook API نقصد واجهة التطبيق البرمجية التى تعطيك القدرة على الوصول الى قاعدة البيانات الخاصة بموقع فيس بوك وجلب البيانات بشروط معينة وفى نطاق معين وكذلك هو الحال فى معظم الـ APIs فمثلا لدى نظام تسجيل اريد من المستخدم ان يقوم بإدخال الاسم الاول والاسم الاخير والايميل و وبالتالي بدل أن من جعل المستخدم يقوم بإدخال هذه البيانات يدويا يمكنني بكل بساطه باستخدام الـ Facebook API بضغطة زر من المستخدم ويتم الحصول على كل البيانات ويدخلها في الحقول تلقائيا وهذا مثال بسيط علي ما يمكن عمله باستخدام الـ API تخيل أنك يمكنك الاستفادة بالعديد من مميزات المواقع الأخرى داخل التطبيقات التي تقوم بعملها هذا باختصار هو الـ API
معلومات عامة عن الـ APIs
توفر العديد من الخدمات والمواقع APIs بعضها مدفوع وبعضها مجانى وبعضها مجانى لكن بحدود وإذا ما تجاوزت هذه الحدود يجب أن تقوم بدفع مقابل فى استخدام الـ API خصوصا عندما يكون تطبيقك كبير الحجم ويستخدمه عدة الاف او ملايين المستخدمين يوميا ولذلك عند رغبتك فى استخدام اى API تقدمه أى خدمة او موقع على الإنترنت تحتاج أولا للتسجيل لديهم وإنشاء تطبيق لديهم أون لاين ليس تطبيق بالمعنى الحرفى ولكن بمثابة حساب أو عضوية او تصريح لك باستخدام الـ API الخاص بهم حيث يقومون بإعطائك مفتاح (Key) تستخدمه من خلال التطبيق الخاص بك فى الاندرويد وتدرجه فى اى اتصال تقوم مع الـ API لكى يتعرف الـ API عليك وعلى تطبيقك ويستطيع اصحاب الخدمة حمايتها او ايقاف تطبيقك اذا ما اسىء الاستخدام او استغل بشكل ما لتحقيق اهداف لا تتفق مع شروط الاستخدام الخاصة بهم .
بعض المواقع والـ APIs توفر مفتاح اخر يطلق عليه Secret بالإضافة للمفتاح العادى ليستخدم فى اغراض التشفير وأمان الاتصال وتبادل البيانات بينك وبين الـ API وبين السيرفرات المختلفة للموقع او الخدمة التى تستخدم الـ API الخاص بها .
الـ Youtube API
كالعديد من الخدمات الاخرى توفر لنا يوتيوب API للتعامل مع محتوى يوتيوب واعطائنا العديد من المميزات يمكن ان نستخدمها فى تطبيقنا اذا كنا نقوم بشىء له علاقة بالفيديوهات ورفعها وتشغيلها وما إلى ذلك فتوفر لنا أكثر من API منها الـ Youtube Player API الذى يعطينا القدرة على التعامل مع عمليات تشغيل الفيديو من خلال يوتيوب وكذلك Youtube Data API اذا كان تطبيقك به محرك بحث للفيديوهات مثلا فانك تقوم بجلب النتائج للمستخدم من يويتوب ومن باقى مواقع الفيديو الاخرى ففى هذه الحالة ستستخدم الـ YoutubeData API حيث يوفر لك access لمحتوى اليويتوب من بيانات خاصة بالفيديوهات ومعلوماتها وجودتها المتوفرة وتواريخها و.. و .. الخ بالاضافة الى ذلك يوجد عدة APIS اخرى فى يوتيوب لكنها اقل اهمية ويمكنك تصفحها من الموقع الرسمى وستستطيع استخدامها بسهولة بعد فهمك الفكرة الرئيسية من طريقة عمل الـ API
وسنتحدث فى هذه التدوينة عن الـ Youtube Player API
إضافة الـ Youtube Player API للتطبيق وإعداده
على عكس الكثير من المكتبات والـ APIs الاخرى توفر لنا جوجل التعامل مع هذا الـ API عن طريقة مكتبة تضاف بالطريقة الكلاسيكية أى مكتبة على هيئة ملف jar يتم اضافتها فى مجلد libs فى التطبيق
يمكننا تحميل الـمكتبة من هذا الرابط
بعد تحميل الملف نقوم بإضافته لمجلد libs وإن لم يكن موجودا يمكنك إنشاءه تحت مجلد app مباشرة
سنقوم بتغيير هيكلة المشروع من Android إلى Project لنستطيع رؤية المجلد libs ثم نقوم بإضافة المكتبة التى تم تحميلها والتى سنتعامل مع الـ API من خلالها .
وفى اغلب الاحيان مع اغلب الـ APIs لا نستطيع استخدام API ببساطة بل يجب علينا الحصول على الـ Key من موفر هذا الـ API وفى هذه الحالة جوجل لذلك نذهب للجوجل كونسول من الرابط التالى
بعد الدخول لهذا الرابط قم بإنشاء مشروع جديد أو استخدم مشروع سابق من مشاريع جوجل كونسول ومن حين لاخر قد تغير جوجل شكل الكونسول أو شكل الواجهه لكن السياق او نظام العمل ثابت وما نريد فعله هو الحصول على key لذلك نختار Credentials ثم Create credentials
وتظهر لنا علامة التنويه ان هذا ال key غير مقيد ويمكن استخدامه مع اى تطبيق ومن الافضل ان نقوم بتقييده بتطبيق معين عن طريق الباكيج وال sha key وما الى ذلك لكننا لا نهتم الان بهذا الامر نريد فقط ال Key
نقوم بنسخ هذا الـ Key للتطبيق البعض يضعه كـ String فى كلاس والبعض يضعه كـ String فى ملف Strings المهم ان تحتفظ به وتستطيع الوصول اليه بسهولة وقت الحاجه من اى مكان داخل التطبيق سأضعه فى ملف strings.xml كالتالى
الان لدينا الـ API Key وجاهزين للانطلاق .
يمكننا استخدام الـ Youtube Player API بأكثر من شكل وبأكثر من طريقة مثلا استخدامه كـ View داخل اكتييتفى او فريجمنت أو استخدام فريجمنت الYoutube Player الجاهز او فتح الفيديو فى أكتييتفى يوتويب مخصص مباشرة فيما يعرف ب standalone player .
استخدام الـ Youtube Player View
يمكننا أن نستخدم الـ Player على هيئة View مثل الـ Views العادية ويوضع كأحد مكونات الـ Layout كالتالى
وكأى view نقوم باستخدامه فى الأندرويد بشكل عام سوف نذهب للجافا ونقوم بتعريف هذا المكون كالتالى
الان عرفنا الـ view وقبل أن نخبر هذا الـ view بعنوان الفيديو الذى سيقوم بتشغيله نحتاج لعمل initialize له واعطاءه الـ API Key الذى جلبناه من جوجل ليسمح لنا بأن نقوم بالتشغيل وذلك باستخدام ميثود تسمى initalize كالتالى
وهذه الميثود كما يتضح تأخذ بارميترين الأول هو s وهو هنا ال Key الخاص بجوجل والبارميتر الثانى هو OnInitiaizedListener وهو Listener يتابع عملية الـ initialize ويخبرك اذا ما تمت بنجاح أم لا قد يكون الـ API خاطىء قد تكون جوجل اوقفت حسابك مثلا أو اى سبب أخر يمكن أن لا يجعل الامر يتم بنجاح لذلك نعرف اذا ما تمت العملية بنجاح ام لا ونتخذ قرارات بناءا على ذلك بمساعدة هذا الـ Listener
وكما ترى يوفر لنا 2 methods الاولى خاصة بحالة النجاح يمكنك كتابة الكود الذى تريد فى حالة نجاح عملية ال initialize والتى غالبا ما تكون تشغيل الفيديو والحالة الاخرى فى حالة الفشل فى التحقق من ال API Key وعملية ال initialize وساعتها ربما تفكر فى اظهار رسالة لطيفة للاعتذار عن الخطأ للمستخدم او تحويله لمشغل اخر او فتح اللينك فى جوجل كروم وتستريح من هذا كله.
الان بداخل الميثود الخاصة بحالة النجاح onInitializationSuccess سنقوم بكتابة كود تحضير الفيديو كالتالى :
لقد استخدمنا الميثود cueVideo لتحضير فيديو للتشغيل باستخدام هذا الPlayer ولاحظ اننا قمنا باعطائه الفيديو id وليس رابط الفيديو كاملا
وهذا الامر بديهى ففى المتصفح تضع الرابط لتخبر المتصفح أنك تريد يوتيوب لكن هنا انت تتعامل مع اليوتيوب مباشرة فبالتأكيد لا يريد منك سوى الـ id بالاضافة الى ذلك يمكنك استخدام بعض الـ Methods الاخرى مثل cuePlaylist والتى تعطيها id playlist لتقوم بتشغيلها بالكامل يمكنك ايضا استخدام الميثود cueVideo ببارميترين الاول هو id الفيديو والثانى هو الملى ثانية التى تريد ان يبدأ عندها الفيديو على سبيل المثال اريد ان يبدأ الفيديو من الدقيقة 2 وهى عباره عن 120 ثانية نقوم بزيادة 3 اصفار على اليمين وبهذا سيبدأ الفيديو التشغيل من الدقيقة 2
يمكنك الحصول على id الفيديو يدويا من الرابط الخاص ب youtube من المتصفح
أو برمجيا اذا كنت تستقبل روابط يوتيوب يمكنك استخراج الـ id برمجيا من الرابط كما فى هذا التعليق على stackoverflow
الان قاربنا على الانتهاء وتشغيل التطبيق يجب أن نشير الى شىء واحد وهو أن اى أكتيتيفى سيتم تشغيل فيه اليوتيوب أو اى فريجمنت سيتم استخدام المشغل فيه يجب علينا ان نقوم بجعل الاكتيتيفى يرث من YoutubeBaseActivity وإن كان فريجمنت نجعله يرث YouTubePlayerFragment لكى يعمل المشغل بشكل صحيح
يجب أيضا أن نقوم بإضافة صلاحيات الإنترنت إلى الـ Manifest بالتأكيد لأن المشغل سيستخدم الإنترنت فى تشغيل الفيديو
وعند الضغط على زر تشغيل سيبدأ بالعمل ولاحظ ان المؤشر متوقف عند الدقيقة الثانية نتيجة أننا أعطيناه فى البارميتر الثانى 120 ثانية تماما .
توجد ميثود اخرى تسمى loadVideo() وهى مثل الميثود السابقة وتأخذ باراميتر id واحد مثلها او 2 باراميترز id الفيديو والثانى الملى ثانية التى يبدأ منها لكن الفرق أن الميثود loadVideo تبدأ تشغيل الفيديو مباشرة لا تنتظر من المستخدم ان يضغط تشغيل
وسنجد انه بمجرد فتح التطبيق يبدأ الفيديو بالعمل مباشرة
كما هو الحال بالنسبة للفيديو يوجد ايضا الميثود cuePlayelist و loadPlayList لكن بدلا من الفيديو تستخدم مع البلاى ليست .
إضافة الى مجموعة methods التشغيل توجد بعض الـ methods الاخرى المفيدة للتحكم بالـ player بشكل افضل مثل الميثود setFullScreen التى تجعل الـ player فى وضع ملء الشاشة وتعطيل او تشغيل زر ملىء الشاشة فعلى سبيل المثال الكود القادم
يقوم هذا الكود بجعل الفيديو ملء الشاشة بالإضافة لاخفاء زر fullscreen ولا يستطيع المستخدم تصغير الفيديو من ملىء الشاشة !
بالإضافة لمجموعة اخرى من الـ Listener لمراقبة حالة المشغل عند التشغيل والتوقف onChangeStateListener و setOnFullScreenListener لاتخاذ اجراء او تنفيذ كود معين فى حالة تكبير الشاشة او تصغيرها بواسطة المستخدم وما الى ذلك من أمور تعطيك القدرة على التحكم بكافة خصائص الـyoutube player بدون حدود يمكنك كتابة youtubePlayer. ثم تجربة كل Method وخصائصها .