NEWS
Gelöst: Neuste Datei (mp4) finden
-
gelöscht
-
@oliverio
Hallo Oliver, du hattest ja den Link "https://brianchildress.co/find-latest-file-in-directory-in-nodejs/". gesendet.
Ich dachte Dein Hinweis bezog sich auf das dort abgebildete Script.Ich weiß das ich noch viel Lernen muss, aber wer nicht fragt bleibt dumm.
In meinem Script Zeile 24 sehe ich nicht das nur MP4 gesucht werden.
var filepath = path.resolve(dir, v);
Michael -
@michihorn @OliverIO hat ja nur gemeint, dass Du dort prüfen kannst,
Du könntest beispielsweise Zeile 25 entsprechend anpassen:
if ( filepath.slice(-4) === '.mp4') return {
-
@mickym
Ich habe das Script etwas umgebaut, sieht jetzt so aus:/*****Letztes Kamerabild Giethoorn Boot************************************** ** Juli 2021 ** RING, Kamera ** ** Ermittelt das letzte gespeicherte Video MP4 von RING-FlootCam ** geändert:26.07.21, 16.8.21 *******************************************************************************/ var zähler = 0; var old_recent; var old_create; var create; var path = require('path'); var fs = require('fs'); var request = require('request'); on({id: 'ring.0.doorbell_21502358.created_at', change: "ne"}, async function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; await wait(100); old_recent = getState('Giethoorn.CAM.Boot.LetztesBild').val; old_create = getState('ring.0.doorbell_21502358.History.created_at').val; create = getState('ring.0.doorbell_21502358.created_at').val; var getMostRecent = function (dir, cb) { var dir = path.resolve(dir); var files = fs.readdir(dir, function (err, files) { var sorted = files.map(function (v) { var filepath = path.resolve(dir, v); if ( filepath.slice(-4) === '.mp4') return { name: v, time: fs.statSync(filepath).mtime.getTime() }; }) .sort(function (a, b) { return b.time - a.time; }) .map(function (v) { return v.name; }); if (sorted.length > 0) { cb(null, sorted[0]); } else { cb('Y U NO have files in this dir?'); } }) } getMostRecent('/iobroker/SmartHome/iobroker-data/files/ring.0/doorbell_21502358/', function (err, recent) { if (err) console.error(err); console.log(recent); setState('javascript.3.Giethoorn.CAM.Boot.LetztesBild', recent); setState('javascript.3.Giethoorn.CAM.Boot.SDate', formatDate(new Date(create), "TT.MM.JJ hh:mm")); const boot = fs.readFileSync('/iobroker/SmartHome/iobroker-data/files/ring.0/doorbell_21502358/' + recent); writeFile("vis.0", "/NL/01Boot.mp4", boot); }); });
Deinen Rat habe ich eingebaut, ist nun in Zeile 29.
Ich bekomme folgenden Fehler:22:11:36.183 error javascript.3 (14660) script.js.Giethoorn.Lastfile_Boot: TypeError: Cannot read property 'name' of undefined 22:11:36.183 error javascript.3 (14660) at script.js.Giethoorn.Lastfile_Boot:36:46 22:11:36.184 error javascript.3 (14660) at script.js.Giethoorn.Lastfile_Boot:36:18 22:11:36.299 error host.DESKTOP-RQ1PD76(SmartHome) Caught by controller[0]: at script.js.Giethoorn.Lastfile_Boot:114:46 22:11:36.299 error host.DESKTOP-RQ1PD76(SmartHome) Caught by controller[0]: at script.js.Giethoorn.Lastfile_Boot:114:18
Michael
-
Wie ich befürchtet hatte musst alles in {} setzen
/*****Letztes Kamerabild Giethoorn Boot************************************** ** Juli 2021 ** RING, Kamera ** ** Ermittelt das letzte gespeicherte Video MP4 von RING-FlootCam ** geändert:26.07.21, 16.8.21 *******************************************************************************/ var zähler = 0; var old_recent; var old_create; var create; var path = require('path'); var fs = require('fs'); var request = require('request'); on({id: 'ring.0.doorbell_21502358.created_at', change: "ne"}, async function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; await wait(100); old_recent = getState('Giethoorn.CAM.Boot.LetztesBild').val; old_create = getState('ring.0.doorbell_21502358.History.created_at').val; create = getState('ring.0.doorbell_21502358.created_at').val; var getMostRecent = function (dir, cb) { var dir = path.resolve(dir); var files = fs.readdir(dir, function (err, files) { var sorted = files.map(function (v) { var filepath = path.resolve(dir, v); if ( filepath.slice(-4) === '.mp4') { return { name: v, time: fs.statSync(filepath).mtime.getTime() }; } }) .sort(function (a, b) { return b.time - a.time; }) .map(function (v) { return v.name; }); if (sorted.length > 0) { cb(null, sorted[0]); } else { cb('Y U NO have files in this dir?'); } }) } getMostRecent('/iobroker/SmartHome/iobroker-data/files/ring.0/doorbell_21502358/', function (err, recent) { if (err) console.error(err); console.log(recent); setState('javascript.3.Giethoorn.CAM.Boot.LetztesBild', recent); setState('javascript.3.Giethoorn.CAM.Boot.SDate', formatDate(new Date(create), "TT.MM.JJ hh:mm")); const boot = fs.readFileSync('/iobroker/SmartHome/iobroker-data/files/ring.0/doorbell_21502358/' + recent); writeFile("vis.0", "/NL/01Boot.mp4", boot); }); });
Ich hab nun aber nicht das ganze Skript nachvollzogen, sondern es wird halt lediglich was zurückgegeben, wenn eine mp4 gefunden wurde. Ursprünglich hatte ich ja auch einen anderen Thread gepostet, mit ähnlichen Anforderungen. Aber den Verweis habe ich wieder gelöscht, da es Dir ja eher um Dein Skript und nicht um die Lösung insgesamt geht. Wollte mich da im Detail auch nicht einmischen.
-
@mickym
Leider nein....22:39:23.565 error javascript.3 (11972) script.js.Giethoorn.Lastfile_Boot: TypeError: Cannot read property 'name' of undefined 22:39:23.565 error javascript.3 (11972) at script.js.Giethoorn.Lastfile_Boot:37:46 22:39:23.565 error javascript.3 (11972) at script.js.Giethoorn.Lastfile_Boot:37:18 22:39:23.680 error host.DESKTOP-RQ1PD76(SmartHome) Caught by controller[0]: at script.js.Giethoorn.Lastfile_Boot:115:46 22:39:23.680 error host.DESKTOP-RQ1PD76(SmartHome) Caught by controller[0]: at script.js.Giethoorn.Lastfile_Boot:115:18
-
@michihorn Probier mal statt dem mapping ein filtering.
also in Zeile 28 statt map filter
var sorted = files.map(function (v) {
in
var sorted = files.filter(function (v) {
-
@mickym sagte in Neuste Datei (mp4) finden:
var sorted = files.filter(function (v) {
Das Script sieht nun so aus:
/*****Letztes Kamerabild Giethoorn Boot************************************** ** Juli 2021 ** RING, Kamera ** ** Ermittelt das letzte gespeicherte Video MP4 von RING-FlootCam ** geändert:26.07.21, 16.8.21 *******************************************************************************/ var zähler = 0; var old_recent; var old_create; var create; var path = require('path'); var fs = require('fs'); var request = require('request'); on({id: 'ring.0.doorbell_21502358.created_at', change: "ne"}, async function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; await wait(100); old_recent = getState('Giethoorn.CAM.Boot.LetztesBild').val; old_create = getState('ring.0.doorbell_21502358.History.created_at').val; create = getState('ring.0.doorbell_21502358.created_at').val; var getMostRecent = function (dir, cb) { var dir = path.resolve(dir); var files = fs.readdir(dir, function (err, files) { //var sorted = files.map(function (v) { var sorted = files.filter(function (v) { var filepath = path.resolve(dir, v); if ( filepath.slice(-4) === '.mp4') { return { name: v, time: fs.statSync(filepath).mtime.getTime() }; } }) .sort(function (a, b) { return b.time - a.time; }) .map(function (v) { return v.name; }); if (sorted.length > 0) { cb(null, sorted[0]); } else { cb('Y U NO have files in this dir?'); } }) } getMostRecent('/iobroker/SmartHome/iobroker-data/files/ring.0/doorbell_21502358/', function (err, recent) { if (err) console.error(err); console.log(recent); setState('javascript.3.Giethoorn.CAM.Boot.LetztesBild', recent); setState('javascript.3.Giethoorn.CAM.Boot.SDate', formatDate(new Date(create), "TT.MM.JJ hh:mm")); const boot = fs.readFileSync('/iobroker/SmartHome/iobroker-data/files/ring.0/doorbell_21502358/' + recent); writeFile("vis.0", "/NL/01Boot.mp4", boot); }); }); Die Fehlermeldung:
23:01:30.974 info javascript.1 (16180) Stop script script.js.Giethoorn.Lastfile_Boot
23:01:30.970 info javascript.3 (13032) Stop script script.js.Giethoorn.Lastfile_Boot
23:01:30.989 info javascript.3 (13032) Start javascript script.js.Giethoorn.Lastfile_Boot
23:01:30.996 info javascript.3 (13032) script.js.Giethoorn.Lastfile_Boot: registered 1 subscription and 0 schedules
23:01:38.008 error host.DESKTOP-RQ1PD76(SmartHome) Caught by controller[0]: at script.js.Giethoorn.Lastfile_Boot:130:25
23:01:38.008 error host.DESKTOP-RQ1PD76(SmartHome) Caught by controller[0]: at script.js.Giethoorn.Lastfile_Boot:119:17 -
OK - bei dem Filter wird nicht mehr gemappt - wahrscheinlich braucht man den Filter und das Mapping.
/*****Letztes Kamerabild Giethoorn Boot************************************** ** Juli 2021 ** RING, Kamera ** ** Ermittelt das letzte gespeicherte Video MP4 von RING-FlootCam ** geändert:26.07.21, 16.8.21 *******************************************************************************/ var zähler = 0; var old_recent; var old_create; var create; var path = require('path'); var fs = require('fs'); var request = require('request'); on({id: 'ring.0.doorbell_21502358.created_at', change: "ne"}, async function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; await wait(100); old_recent = getState('Giethoorn.CAM.Boot.LetztesBild').val; old_create = getState('ring.0.doorbell_21502358.History.created_at').val; create = getState('ring.0.doorbell_21502358.created_at').val; var getMostRecent = function (dir, cb) { var dir = path.resolve(dir); var files = fs.readdir(dir, function (err, files) { var filesFiltered = files.filter(function (v) { var filepath = path.resolve(dir, v); if ( filepath.slice(-4) === '.mp4') return true; }) var sorted = filesFiltered.map(function (v) { var filepath = path.resolve(dir, v); return { name: v, time: fs.statSync(filepath).mtime.getTime() }; }) .sort(function (a, b) { return b.time - a.time; }) .map(function (v) { return v.name; }); if (sorted.length > 0) { cb(null, sorted[0]); } else { cb('Y U NO have files in this dir?'); } }) } getMostRecent('/iobroker/SmartHome/iobroker-data/files/ring.0/doorbell_21502358/', function (err, recent) { if (err) console.error(err); console.log(recent); setState('javascript.3.Giethoorn.CAM.Boot.LetztesBild', recent); setState('javascript.3.Giethoorn.CAM.Boot.SDate', formatDate(new Date(create), "TT.MM.JJ hh:mm")); const boot = fs.readFileSync('/iobroker/SmartHome/iobroker-data/files/ring.0/doorbell_21502358/' + recent); writeFile("vis.0", "/NL/01Boot.mp4", boot); }); });
Ich hab jetzt einfach noch ein gefiltertes Array erzeugt, dass dann mit den Objekten gemappt wird - und ins sorted Array geschrieben wird.
EDIT 23:28 - war noch ein Klammerfehler drin im Skript - so müsste es aber gehen.
-
@mickym sagte in Neuste Datei (mp4) finden:
/Letztes Kamerabild Giethoorn Boot********************************* ** Juli 2021 ** RING, Kamera ** ** Ermittelt das letzte gespeicherte Video MP4 von RING-FlootCam ** geändert:26.07.21, 16.8.21 *******************************************************************************/ var zähler = 0; var old_recent; var old_create; var create; var path = require('path'); var fs = require('fs'); var request = require('request'); on({id: 'ring.0.doorbell_21502358.created_at', change: "ne"}, async function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; await wait(100); old_recent = getState('Giethoorn.CAM.Boot.LetztesBild').val; old_create = getState('ring.0.doorbell_21502358.History.created_at').val; create = getState('ring.0.doorbell_21502358.created_at').val; var getMostRecent = function (dir, cb) { var dir = path.resolve(dir); var files = fs.readdir(dir, function (err, files) { var filesFiltered = files.filter(function (v) { var filepath = path.resolve(dir, v); if ( filepath.slice(-4) === '.mp4') return true; }) var sorted = filesFiltered.map(function (v) { var filepath = path.resolve(dir, v); return { name: v, time: fs.statSync(filepath).mtime.getTime() }; }) .sort(function (a, b) { return b.time - a.time; }) .map(function (v) { return v.name; }); if (sorted.length > 0) { cb(null, sorted[0]); } else { cb('Y U NO have files in this dir?'); } }) } getMostRecent('/iobroker/SmartHome/iobroker-data/files/ring.0/doorbell_21502358/', function (err, recent) { if (err) console.error(err); console.log(recent); setState('javascript.3.Giethoorn.CAM.Boot.LetztesBild', recent); setState('javascript.3.Giethoorn.CAM.Boot.SDate', formatDate(new Date(create), "TT.MM.JJ hh:mm")); const boot = fs.readFileSync('/iobroker/SmartHome/iobroker-data/files/ring.0/doorbell_21502358/' + recent); writeFile("vis.0", "/NL/01Boot.mp4", boot); }); });
Herzlichen Dank, das klappt