added deno script to generate wallpapers metadata from images

This commit is contained in:
Philippe Loctaux 2023-05-17 22:25:08 +02:00
parent 8338252433
commit 281f0984bb
5 changed files with 76 additions and 6 deletions

4
.gitignore vendored
View file

@ -1,3 +1,6 @@
# wallpapers
/public/wallpapers.json
# build output
dist/
# generated types
@ -21,5 +24,4 @@ pnpm-debug.log*
.DS_Store
# ide
.vscode/
.idea/

7
.vscode/settings.json vendored Normal file
View file

@ -0,0 +1,7 @@
{
"deno.enable": true,
"deno.unstable": true,
"deno.enablePaths":[
"./utils/"
]
}

View file

@ -3,11 +3,12 @@
"type": "module",
"version": "0.0.1",
"scripts": {
"dev": "astro dev",
"start": "astro dev",
"build": "astro build",
"preview": "astro preview",
"astro": "astro"
"dev": "npm run wallpapers && astro dev",
"start": "npm run wallpapers && astro dev",
"build": "npm run wallpapers && astro build",
"preview": "npm run wallpapers && astro preview",
"astro": "astro",
"wallpapers": "deno run --allow-read --allow-net --allow-write utils/wallpapers.ts"
},
"dependencies": {
"@astrojs/tailwind": "^3.1.2",

View file

60
utils/wallpapers.ts Normal file
View file

@ -0,0 +1,60 @@
import exifr from "npm:exifr@^7.1.3";
import { writeJson } from "https://deno.land/x/jsonfile@1.0.0/mod.ts";
const publicPath = "/public";
const wallpapersPath = "/wallpapers";
const imagesPath = `${Deno.cwd()}${publicPath}${wallpapersPath}`;
interface MyWallpaper {
file: string;
location: string;
date: string;
}
const wallpapers: MyWallpaper[] = [];
// For each file in the wallpapers directory
for await (const dirEntry of Deno.readDir(imagesPath)) {
if (!dirEntry.isFile || dirEntry.name === ".gitkeep") {
continue;
}
// Open file
const path = `${imagesPath}/${dirEntry.name}`;
const bytes = await Deno.readFile(path);
// Parse exif
const exif = await exifr.parse(bytes);
// Timezones are too hard
const timestamp = Date.parse(exif.DateTimeOriginal);
const dateObject = new Date(timestamp);
const date = dateObject.toISOString().split("T")[0];
// Http request to get location
const response = await fetch(
`https://nominatim.openstreetmap.org/reverse?format=json&lat=${exif.latitude}&lon=${exif.longitude}&zoom=5`,
{ headers: { "User-Agent": "https://philippeloctaux.com" } }
);
const data = await response.json();
const location = data?.display_name;
// Final filename
const file = `${wallpapersPath}/${dirEntry.name}`;
console.log(`Processed ${file}`);
wallpapers.push({
file,
date,
location,
});
}
// write to /public/wallpapers.json
const jsonPath = `${Deno.cwd()}${publicPath}/wallpapers.json`;
await writeJson(jsonPath, wallpapers);
console.log(`Wrote to ${jsonPath}`);