Hey guys,

I need your help :).

My module “Pictures” can show any kind of pictures, located on a mounted network drive. On startup node_helper mounts a specific drive, then it scans this folder every two seconds (it could be any other value) and write all filenames in a text file. Pictures imports and filters this file. At the end it generates a slideshow.

Now I want to implement pdf files in the same way. Actually it works with a little workaround but I’m not happy with that. I have to start MagicMirror and additionally I have to start another browser (unfortunatelly “node serveronly” doesn’t work) on the pi to show pdf files with the integrated plugin.

For that I have several questions^^:

Is there a possibility to show pdf files native in my module? My slideshow is a little laggy on the pi (3B). Any PC with the same network connection shows the same slideshow in browser with perfect performance. Can I improve my slideshow performance anyhow? I have a problem to run “node serveronly” with raspian stretch an the new MagicMirror 2.3.1. I can start but as soon as I connect to the pi by IP:8080 my module generates -75 errors. This won’t happen if MagicMirror runs with “npm start”.

Best regards
flash

node_helper.js

var request = require('request'); var NodeHelper = require("node_helper"); const exec = require('child_process').exec; module.exports = NodeHelper.create({ start: function() { this.started = false; }, socketNotificationReceived: function(notification, payload) { if (notification === "CONFIG" && this.started == false) { this.config = payload; // mounting network drive exec("/usr/bin/sudo mount -t cifs -o user=" + this.config.user + ",password=" + this.config.password + " " + this.config.source + " /home/pi/MagicMirror/modules/Pictures/images", null); this.started = true; } if (notification === "GET_PICTURE_DATA" && this.started) { var path = "/home/pi/MagicMirror/modules/Pictures/images/"+ this.config.folder + "/"; var opt1 = '-type f ! -path "/home/pi/MagicMirror/modules/Pictures/images/' + this.config.folder + '/.thumb/*" | awk -F"/"' var opt2 = '{print $NF"/" }'; var opt3 = '| sort > ~/MagicMirror/modules/Pictures/files.txt'; exec("find " + "'" + path + "' " + opt1 + " '" + opt2 + "' " + opt3, null); this.getData(payload); } }, getData: function(options) { request(options, (error, response, body) => { this.sendSocketNotification("PICTURE_DATA", body); }); } });

Pictures.js

var showPicture = 0; var textdata = []; var textdataHelp = []; var findExt = []; Module.register("Pictures",{ defaults: { loadingText: 'Lade SlideShow...', pictureInterval: 20 * 1000, }, start: function() { Log.info("Starting module: " + this.name); this.loaded = false; this.sendSocketNotification('CONFIG', this.config); this.locationSelf = window.location.href; this.file = 'modules/Pictures/files.txt'; setTimeout(this.updateFiles, 2000, this); }, socketNotificationReceived: function(notification, payload){ if(notification === 'PICTURE_DATA' && payload !== null){ this.loaded = false; textdataHelp = payload.split("/\n"); if (textdataHelp[0] !== ""){ textdata = []; // textdata will not be cleared, if helper has no content } for (i = 0; i textdata.length - 1) { showPicture = 0; } self.updateDom(1000); showPicture++; } }, getDom: function() { var wrapper = document.createElement("div"); var pictureInfo = document.createElement('table'); if (!this.loaded) { wrapper.innerHTML = this.config.loadingText; return wrapper; } var currCount = showPicture + 1; var tableHead = document.createElement('tr'); tableHead.className = 'normal small'; var y = 0 findExt = textdata[showPicture].split("."); for (i = 0; i 0){ //tableHead.innerHTML = '<br />' + currCount + '/' + textdata.length; tableHead.innerHTML = '<br />' + currCount + '/' + textdata.length; }else{ tableHead.innerHTML = '<img src="' + this.locationSelf + 'modules/Pictures/images/' + this.config.folder + '/' + textdata[showPicture] +'" alt="Vorschau" /><br />' + currCount + '/' + textdata.length; } y = 0; findExt = []; pictureInfo.appendChild(tableHead); wrapper.appendChild(pictureInfo); return wrapper; }, });