Electron based desktop application for setting geotags for images
This project runs inside Electron standalone application, with React.js based frontend application, that was bootstrapped with Create React App version 3, with TypeScript.
The map is made with Leaflet and data is handled via Redux Zero.
It will also be available as a web site at paazmaya.github.io/kanigawa because it can. However the geotagging functionality is limited to a single image at a time.
I got so fed up with its bugs and lack of support for changes in the Google Maps API, so decided to go and solve the problem while also making myself to learn about Electron and NW.js.
Surely there are other tools trying to achieve this functionality but they usually lack something that I deem valuable.
Since the beginning of this project, Picasa has already ceased to exists.
As I have done now for few of my recent projects, the names are trying to give a tribute to
ancient masters of Japanese martial arts. For example
maezato
,
sakugawa
, and
shigehachi
.
In the case of kanigawa
, the name stands for a teacher who was known in the Ryukyu archipelago
(of which Okinawa is the biggest island) and had influence on the martial arts known as
karate and ryukyu kobujutsu today.
Clone or download this repository and run the following command to start the application:
npm install
npm run build
npm run electron:start
Please note that the minimum supported version of Node.js is 14.15.0
, which is the active Long Term Support (LTS) version.
Later it should be possible to install this application globally and start it wherever it is common in the given platform:
[sudo] npm install --global kanigawa
Please note that exiv2
is used for image meta data handling and because it is a native library,
the Node.js bindings for it required some platform dependant libraries installed.
Pick the suitable command for your environment:
brew install pkg-config exiv2 # Mac
sudo apt-get install libexiv2 libexiv2-dev # Debian/Ubuntu
...or download for Windows.
The file called package.json
lists the 3rd party libraries and tools, of which
the property dependencies
are the ones needed for the frontend React application and
the property devDependencies
are those needed for Electron based standalone application.
It is also possible to run the too,l without Electron, just for testing purposes, by running these two commands in separate terminals:
node websocket-server-for-testing-in-browser.js
npm start
The React based frontend application has been initialised with Create React App which provided the following commands:
npm start
: Runs the app in the development mode, available at http://localhost:3000npm test
: Run Jest based unit testsnpm run build
: Creates production bundle to thebuild
foldernpm run eject
: One way exit operation to see what is underneath Create React App generated boilerplatenpm run deploy
: Deploy frontend to GitHub Pages at paazmaya.github.io/kanigawa
You can learn more in the Create React App documentation.
The Electron standalone application container has been initialised with Electron Forge and it has provided this project with the following commands:
npm run electron:start
npm run electron:package
npm run electron:make
npm run electron:publish
Before the above commands are useful, the React based frontend application should be build with the npm run build
command.
Electron accepts some command line options to be passed on Chrome,
which can be seen with chrome --js-flags="--help"
command.
Deployed to GitHub Pages
There is a special gh-pages
branch which is updated via CI and then made available as paazmaya.github.io/kanigawa.
The generated site only supports fresh browsers and cannot be operated with such legacy browsers, such as Internet Explorer.
The frontend of the site relies on the use of WebSockets for communication with the backend.
- Open a directory on the grid view
- Drag image to a location on a map
- Existing geotagged images in the current grid will be shown as thumbnail markers on the map
- Image can be dragged on top of a thumbnail on the map, which places it at the same location
- Image thumbnails on map can be shown as dimmed, while the location reuse is not available, as it is sometimes desired behaviour to avoid nearby mistakes
- Clicking on thumbnail on a map, selects the image from the grid, but why?
- Sort by file attributes and most common metadata properties
- Service Worker should do the scanning of the image files and thumbnail creation
- In order to keep React app able to run in a normal browser, communication via WebSockets, https://caniuse.com/#feat=websockets
- Publish to GitHub https://www.electronforge.io/config/publishers/github
- Automatic updates with https://github.com/electron/update-electron-app
- Map default centre is determined by the most used location for geotag
- Used locations are stored locally, but with only three digits, hence the accuracy is not too discriminating
- That inaccuracy will help approximate the location heat map and over time give much more pleasant user experience
Should I mention that once a proper interaction model is found, it needs to work with Leap Motion?
- Choose images
- Use voice command to specify saved location, such as "home" or "clear"
- Profit.
Licensed under the MIT license.
Copyright (c) Juga Paazmaya paazmaya@yahoo.com
Contributions are licensed via Developer Certificate of Origin.