102 lines
2.6 KiB
JavaScript
102 lines
2.6 KiB
JavaScript
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()
|
|
})
|