feat: initial version

This commit is contained in:
2024-02-18 15:00:07 +01:00
commit 8e9398bd02
4 changed files with 115 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
/node_modules/

30
package-lock.json generated Normal file
View File

@@ -0,0 +1,30 @@
{
"name": "Downloads",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"dependencies": {
"exifreader": "^4.21.0"
}
},
"node_modules/@xmldom/xmldom": {
"version": "0.8.10",
"resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz",
"integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==",
"optional": true,
"engines": {
"node": ">=10.0.0"
}
},
"node_modules/exifreader": {
"version": "4.21.0",
"resolved": "https://registry.npmjs.org/exifreader/-/exifreader-4.21.0.tgz",
"integrity": "sha512-A/EjsCKdfzzF2lvi+iu2klTOZNYf3MrXJAYKX+NyJn35wlujGmbDGVvZ+21FYy3ZxsWHwf37VntgMrQXFuR5sA==",
"hasInstallScript": true,
"optionalDependencies": {
"@xmldom/xmldom": "^0.8.10"
}
}
}
}

5
package.json Normal file
View File

@@ -0,0 +1,5 @@
{
"dependencies": {
"exifreader": "^4.21.0"
}
}

79
update_ts.mjs Normal file
View File

@@ -0,0 +1,79 @@
import fs from "fs/promises";
import ExifReader from "exifreader";
import path from "path";
if (process.argv.length === 2) {
console.error("Expected exactly one argument");
process.exit(1);
}
const dir = process.argv[2];
let fileNames;
try {
fileNames = await fs.readdir(dir);
} catch (error) {
console.error("Error reading directory.", error);
process.exit(2);
}
/**
* @param fileName {string}
* @return {Date|null}
*/
function getDateFromFileName(fileName) {
const r = /(\d{4})-?(\d{2})-?(\d{2})[_\-](\d{2})-?(\d{2})-?(\d{2})/.exec(
fileName,
);
if (!r) throw new Error("The file name did not match the pattern.");
return new Date(`${r[1]}-${r[2]}-${r[3]}T${r[4]}:${r[5]}:${r[6]}`);
}
/**
* @param filePath {string}
* @param fileName {string}
* @return {Promise<Date|null>}
*/
async function getDate(filePath, fileName) {
if (/\.mp4$/.test(fileName)) {
return getDateFromFileName(fileName);
}
const tags = await ExifReader.load(filePath);
let timeString = tags.DateTime?.value[0];
if (timeString === undefined) {
return getDateFromFileName(fileName);
}
const exifDate = new Date(
timeString.replace(
/(\d{4}):(\d{2}):(\d{2}) (\d{2}):(\d{2}):(\d{2})/,
"$1-$2-$3T$4:$5:$6",
),
);
if (isNaN(exifDate.getTime()) || exifDate.getFullYear() < 2000) {
return getDateFromFileName(fileName);
}
return exifDate;
}
for (const fileName of fileNames) {
const filePath = path.resolve(dir, fileName);
let date;
try {
date = await getDate(filePath, fileName);
} catch (error) {
console.error(filePath, error.message);
continue;
}
if (date === null) {
console.error(filePath, "Could not get a date.");
continue;
}
console.log(filePath, date);
await fs.utimes(filePath, date, date);
}