Read the statement by Michael Teeuw here.
Need help creating a module.
-
Being from one of the remotest part of the world, it’s not easy to get the local news from the convenient sources to stay updated, having no options I was using the default newsfeed modules. My only source of local news is the local YouTube news channel, therefore I was looking for ideas to implement something similar to display the titles of the latest YouTube videos on the mirror. I used the MMM-Pythonprint module for doing that, unfortunately I couldn’t figure out a way to rotate the titles one at a time since my python script prints the title of latest 10 videos using YouTube api.
I then stumbled upon chatgpt, I asked it to create a module for me to use this functionality.
It did create the module, it gave me the following codes but due to some reasons I could not get it to work, Iam still a learner and I have zero knowledge about codes. Im hoping someone will stumble upon this and figure out a wayThis is the main.js
Module.register("MMM-LocalNews", { // Default module config. defaults: { channelId: "UCX6OQ3DkcsbYNE6H8uQQuVA", apiKey: "YOUR_API_KEY", updateInterval: 60 * 60 * 1000, // Every hour. animationSpeed: 2 * 1000, initialLoadDelay: 0, retryDelay: 2500, maxTitles: 10, reverse: false }, // Define required scripts. getScripts: function() { return []; }, // Define required styles. getStyles: function() { return [ "MMM-LocalNews.css" ]; }, // Define start sequence. start: function() { Log.info("Starting module: " + this.name); // Set locale. moment.locale(config.language); this.videoTitles = []; this.scheduleUpdate(); }, // Override the getDom method. getDom: function() { var wrapper = document.createElement("div"); wrapper.className = "video-titles"; if (!this.videoTitles.length) { wrapper.innerHTML = "Loading video titles..."; wrapper.classList.add("bright", "light"); return wrapper; } if (this.config.reverse) { this.videoTitles.reverse(); } this.videoTitles.forEach(function(videoTitle) { var title = document.createElement("div"); title.className = "video-title"; title.innerHTML = videoTitle; wrapper.appendChild(title); }); return wrapper; }, // Request video titles from the node helper. scheduleUpdate: function() { setTimeout(function() { this.sendSocketNotification("GET_VIDEO_TITLES", { channelId: this.config.channelId, apiKey: this.config.apiKey }); }.bind(this), this.config.initialLoadDelay); setInterval(function() { this.sendSocketNotification("GET_VIDEO_TITLES", { channelId: this.config.channelId, apiKey: this.config.apiKey }); }.bind(this), this.config.updateInterval); }, // Handle the video titles received from the node helper. socketNotificationReceived: function(notification, payload) { if (notification === "VIDEO_TITLES") { this.videoTitles = payload.titles.slice(0, this.config.maxTitles); this.updateDom(this.config.animationSpeed); } } });
And here is the node_helper.js
var https = require("https"); // Replace YOUR_API_KEY with your actual API key. var apiKey = "YOUR_API_KEY"; var channelId = "UC_CHANNEL_ID"; // Build the API request URL. var url = "https://www.googleapis.com/youtube/v3/search?key=" + apiKey + "&channelId=" + channelId + "&part=snippet,id&order=date&maxResults=10"; https.get(url, function(res) { var body = ""; res.on("data", function(chunk) { body += chunk; }); res.on("end", function() { var response = JSON.parse(body); var titles = []; for (var i = 0; i < response.items.length; i++) { titles.push(response.items[i].snippet.title); } console.log(titles); }); }).on("error", function(error) { console.log("Error: " + error.message); });
I have also created a GitHub repository for the same
link to repoCan anyone provide me another alternative to do this because this module doesn’t work, or can someone fix this module to make it work. Thanks
-
@sdmydbr9
Module has been created and working version has been published in GitHub. Feel free to Check out -
@sdmydbr9 A few things are missing. Your MMM-LocalNews.js sends a Socket Notification which the node_helper is supposed to listening for and act upon. The node_helper need a socketNotificationReceived in order to start its work. When it is done doing it’s work it needs to send the data back to the MMM-LocalNews.js (sendSocketNotifcation). Have a look at this sample module https://github.com/sdetweil/SampleModule.
-
@mumblebaj so to sum up, the main.is is correct and I need to edit the nodehelper.js script?
-
@mumblebaj
Here is the updated nodehelpervar https = require("https"); module.exports = NodeHelper.create({ // Override start method. start: function() { console.log("Starting node helper for: " + this.name); }, // Handle the GET_VIDEO_TITLES socket notification. socketNotificationReceived: function(notification, payload) { if (notification === "GET_VIDEO_TITLES") { var apiKey = payload.apiKey; var channelId = payload.channelId; var url = "https://www.googleapis.com/youtube/v3/search?key=" + apiKey + "&channelId=" + channelId + "&part=snippet,id&order=date&maxResults=10"; https.get(url, function(res) { var body = ""; res.on("data", function(chunk) { body += chunk; }); res.on("end", function() { var response = JSON.parse(body); var titles = []; for (var i = 0; i < response.items.length; i++) { titles.push(response.items[i].snippet.title); } // Send the video titles back to the module. this.sendSocketNotification("VIDEO_TITLES", { titles: titles }); }.bind(this)); }.bind(this)).on("error", function(error) { console.log("Error: " + error.message); }); } } });
-
@sdmydbr9
Module has been created and working version has been published in GitHub. Feel free to Check out -
@sdmydbr9 Awesome. Glad we could help