const rclone = require('rclone.js') const schedule = require('node-schedule') const fs = require('fs') const sharp = require('sharp') const inky = require('@aeroniemi/inky') const mqtt = require('mqtt') const frame = new inky.Impression73() const folder = './gallery/' // Connect to MQTT const mqttclient = mqtt.connect('mqtt://mqtt.srv.jnf.me', { clientId: 'pictureframe_' + Math.random().toString(16).substr(2, 8), username: 'pictureframe', password: 'pictureframe' }) var ticker = false var filelist = false function downloadImgs() { console.log('Starting download from Google Photos...') const sync = rclone.sync('gphotos:album/Family Room Photo Frame', folder) sync.stdout.on('data', function(data) { console.log(data.toString()) }) sync.on('exit', function() { console.log('Synchronized from Google Photos. Loading images...') loadImgs() }) } function loadImgs() { fs.readdir(folder, (err, files) => { if (err || files.length == 0) { console.log('No images found. Exiting.') process.exit(1) } else { console.log(files.length + ' images found. Starting album display...') filelist = files displayAlbum() } }) } function displayAlbum() { if (filelist.length == 0) loadImgs() else { imgref = Math.floor(Math.random() * filelist.length) imgfile = filelist.splice(imgref, 1)[0] console.log('Randomly displaying image ' + (imgref + 1) + ' of ' + (filelist.length + 1) + ' remaining: ' + imgfile) displayImage(imgfile) ticker = setTimeout(displayAlbum, 1800000) } } function displayImage(filename) { sharp(folder + filename) .resize(800,480) .toFile('output.png', (err, info) => { frame.display_png('output.png') frame.show() }) } function displayWifi() { console.log('Displaying wifi connection information for 10 minutes') clearTimeout(ticker) frame.display_png('img/wifi.png') frame.show() ticker = setTimeout(displayAlbum, 600000) } // Subscribe to our MQTT topic... mqttclient.on('connect', () => { mqttclient.subscribe('pictureframe/command') }) // Listen for MQTT command messages mqttclient.on('message', (topic, message) => { message = message.toString() console.log('MQTT command received: ' + message) if (message == 'wifi') displayWifi() if (message == 'reset') { clearTimeout(ticker) downloadImgs() } }) // We start by downloading images. Other functions will be called if this is successful... downloadImgs() // Define a cron-job to restart everything at 1:30am (including a refresh of the album).... schedule.scheduleJob('0 30 1 * * *', function() { clearTimeout(ticker) console.log('Resetting...') downloadImgs() })