معرفی
راه اندازی و ایجاد Web API
من در ابتدا به استفاده از NET Core در Windows IoT فکر کردم اما بعداً تصمیم گرفتم از Raspian OS و NodeJS استفاده کنم زیرا میخواستم NodeJS را با برخی از برنامههای دنیای واقعی امتحان کنم.
راه اندازی Raspian OS در Raspberry PI بسیار ساده بود. من به تازگی این مقاله عالی را در مورد نحوه راه اندازی Raspian در Raspberry PI دنبال کردم. همچنین، من اتصال از راه دور را پیکربندی کردم و پوشه کار را برای استقرار فایل ها به اشتراک گذاشتم تا دیگر نیازی به Raspberry PI خود نداشته باشم که به تلویزیون خود متصل است. من فقط Raspberry PI را به همراه سایر جعبههای جریان خود قرار دادم و از طریق لپتاپم با استفاده از دسکتاپ از راه دور متصل شدم.
من NodeJS Web API را با بسته های Node زیر شروع کردم تا فیدهای Channel 9 را تجزیه کنم.
- بیان
- Cheerio
- XMLBuilder
Express یکی از معروف ترین فریم ورک های کاربردی وب Node.js برای ایجاد سریع و آسان Web API است. Cheerio برای تجزیه عناصر DOM استفاده می شود. XMLBuilder برای ساختن خروجی XML به روشی آسان استفاده می شود.
برای شروع، وب سرور را با مسیریابی به صورت زیر ایجاد کردم:
- var express = require('express')
- , app = express()
- , server = require('http').createServer(app)
- , path = require('path')
- var parser = require('./lib/parser');
- app.set('port', 4567);
- app.use(express.static(path.join(__dirname, 'public')));
- //Routes
- app.get('/', function (req, res) {
- res.sendFile(__dirname + '/public/index.html');
- });
- app.get('/Ch9', function (req, res) {
- parser.Ch9(function (result) {
- res.set('Content-Type', 'text/xml')
- res.send(200, result)
- })
- });
- app.get('/Ch9/:topic/List', function (req, res) {
- var topic = req.params.topic;
- parser.Ch9List(topic, function (result) {
- res.set('Content-Type', 'text/xml')
- res.send(200, result)
- });
- });
- app.get('/Ch9/:topic/:title/View', function (req, res) {
- var topic = req.params.topic;
- var title = req.params.title;
- parser.Ch9View(topic, title, function (result) {
- res.set('Content-Type', 'text/xml')
- res.send(200, result)
- });
- });
من کلاس کتابخانه تجزیه کننده را ایجاد کردم و کد زیر را برای تجزیه محتوای RSS کانال 9 برای واکشی URL های ویدیو اضافه کردم.
- const topicLists = ["Shows", "Events", "Series", "Blogs"];
- const ch9BaseURL = "http://channel9.msdn.com/Browse/";
- exports.Ch9 = function (callback) {
- var xml = builder.create('categories');
- var cIndex;
- for (cIndex in topicLists) {
- var category = xml.ele("category");
- category.att("title", topicLists[cIndex]);
- category.att("description", topicLists[cIndex]);
- var catLeaf = category.ele("categoryLeaf");
- catLeaf.att("title", topicLists[cIndex]);
- catLeaf.att("description", topicLists[cIndex]);
- catLeaf.att("feed", appBaseURL + "Ch9/" + topicLists[cIndex] + "/List/");
- }
- xml.end({ pretty: true });
- callback(xml.toString());
- }
- exports.Ch9List = function (topic, callback) {
- var xml;
- request(ch9BaseURL + topic + '/rss?sort=recent', function (error, response, html) {
- if (!error && response.statusCode == 200) {
- var $ = cheerio.load(html, { ignoreWhitespace: true, xmlMode: true });
- xml = builder.create('categories');
- var currIndex = 0;
- $('item').each(function (i, element) {
- var category = xml.ele("category");
- category.att("title", $(element).find('title').text());
- category.att("description", $(element).find('description').text());
- var catLeaf = category.ele("categoryLeaf");
- catLeaf.att("title", $(element).find('title').text());
- catLeaf.att("description", $(element).find('description').text());
- catLeaf.att("feed", appBaseURL + "Ch9/" + topic + "/" + encodeURIComponent($(element).find('title').text()) + "/View/");
- currIndex++;
- });
- xml.end({ pretty: true });
- callback(xml.toString());
- }
- });
- }
- exports.Ch9View = function (topic, title, callback) {
- var xml;
- request(ch9BaseURL + topic + '/rss?sort=recent', function (error, response, html) {
- if (!error && response.statusCode == 200) {
- var $ = cheerio.load(html, { ignoreWhitespace: true, xmlMode: true });
- var curElement = $('item').filter(function (i, el) {
- return $(this).find('title').text() === title;
- });
- var feedURL = $(curElement).find('c9\\:feed').text();
- if (!feedURL)
- feedURL = $(curElement).find('c9\\:feed').text() + "/Rss";
- request(feedURL, function (error, response, html) {
- var $ = cheerio.load(html, { ignoreWhitespace: true, xmlMode: true });
- xml = builder.create('feed');
- var loopIndex = 0;
- $('item').each(function (i, element) {
- var url = $(element).find('media\\:content').filter(function (i, el) {
- return $(this).attr('url').includes("_high");
- }).attr("url");
- var item = xml.ele('item');
- item.att('sdImg', $(this).children('media\\:thumbnail').attr('url'));
- item.att('hdImg', $(this).children('media\\:thumbnail').attr('url'));
- item.att('thumbnailURL', $(this).children('media\\:thumbnail').attr('url'));
- item.ele('title', $(this).children('title').text());
- item.ele('contentId', loopIndex);
- item.ele('streamFormat', 'mp4');
- var media = item.ele('media');
- media.ele('streamUrl', url);
- media.ele('thumbnailURL', $(this).children('media\\:thumbnail').attr('url'));
- loopIndex++;
- });
- xml.end({ pretty: true });
- callback(xml.toString());
- });
- }
- });
- }
خودشه. ما به تازگی وب API را با استفاده از NodeJS تنها با چند خط کد پیاده سازی کرده ایم. اگر برنامه خود را با استفاده از http://localhost:4567/ch9 اجرا کنم، با خروجی xml پاسخ میدهد.
استقرار نیز فوق العاده آسان است. فقط پوشه را به استثنای پوشه Node_Modules کپی کنید. شما نیازی به استقرار پوشه node_modules ندارید. می توانید دستور NPM Update را اجرا کنید تا پوشه node_modules را پس از استقرار از PI Server دریافت کنید تا در زمان استقرار صرفه جویی شود.
برای اجرای اپ سرور کافیست ترمینال را از راسپین باز کنید و با استفاده از دستور Node APP.js زیر آن را اجرا کنید تا وب سرور شخصی شما آماده سرویس دهی شود.
من قبل از استقرار UrlCategoryFeed را در categoryFeed.brs در برنامه Roku تغییر داده ام.
به روز رسانی: Roku اخیراً برنامه نمونه کانال ویدیویی خود را به روز کرده است و برنامه جدید را می توانید در اینجا پیدا کنید . می توانید تمام مقالات من را در https://jeevasubburaj.com پیدا کنید
کد نویسی مبارک!!