This project is a work in progress. It's not quite ready for any practical use yet. See here for an up-to-date public demo.
It has three main goals:
- To provide a powerful photo management system (like, for example, Picasa)
- To allow for connection to a self-hosted file server
- To be open source
Example use case: I want to be able to remotely synchronise the photos on my phone and my computer, and organise them on either one. But, I don't want the cost/privacy issues of uploading to a third-party site.
See also Photo-Manager-Server for the Django-based server-side code. This client does not yet function without a server to connect to.
- Install NPM
- Clone this repository (
git clone https://github.com/zsmith3/Photo-Manager-Client/
) and enter the directory (cd Photo-Manager-Client
) - Install NPM dependencies (
npm install
) - Get a Google Maps Javascript API Key (see here) and add it to the ./build_config.js file.
- For Cordova:
- Install Cordova globally (
npm install -g cordova
) - Enter the cordova directory (
cd cordova
) and runmkdir www
thencordova prepare
to install required platforms/plugins - To generate icons/splash screen:
- Install ImageMagick (including legacy tools)
- Install cordova-splash and cordova-icon (
npm install -g cordova-icon cordova-splash
) - Run (from cordova directory)
cordova-icon
andcordova-splash
- Install external requirements to build to certain platforms (e.g. see here for Android)
- Install Cordova globally (
Note: to avoid errors with google-maps-react, change type Style = Object<string, string | number | boolean>
to type Style = { [key: string]: string | number | boolean }
in index.d.ts
.
npm run build
can be used to build the client, with various options:
platform
(required) - The platform to build for ("browser"
or"cordova"
)buildType
(required) - The build environment ("production"
or"development"
)server
- The back-end server URL to connect to (should end in"/"
)outDir
- The local directory to output build topublicUrl
- The (relative) public URL at which files will be hostedpreScript
- The local path to an HTML file, containing any additional content which should be injected into the outputindex.html
(before other scripts)
The default values for non-required options can be found (and edited) in ./build_config.js. This is a user-specific file, the defaults for which are found in ./scripts/default_build_config.js. Since named arguments are not yet supported, all options must be given in order, and null
can be used as a placeholder to skip unwanted arguments.
Example Usage:
npm run build browser development
npm run build browser production https:localhost/fileserver/ null null extra-script.html
In order to build/run Cordova, you will then need to cd cordova
and run the relevant Cordova build command.
Here is a list of existing features, as well as features which I intend to add in the future. This list may not be comprehensive.
- Sorting capabilities
- Albums
- Albums can have (infinitely recursive) child albums
- Files added to child albums are automatically included in parent albums
- Files can be added to (multiple) albums
- Albums can have (infinitely recursive) child albums
- People
- New files are scanned for contained faces
- Faces can be manually identified as belonging to certain people
- Predictions for people to which faces belong
- Run this automatically
- Users can confirm predictions
- Allow undetected faces to be added manually
- Geotags
- Geotags are read from EXIF data
- Files can be given a geotag, which includes co-ordinates, and an "area"
- Geotag areas include a name, address, co-ordinates and area radius
- Scanned photos can be added, cropped automatically and saved to main folder
- Feature tags
- Albums
- Page components
- Navigation drawer
- Links to scanned photos
- Lists albums
- Shows a hierarchical list, with collapsible lists of child albums
- Albums can be renamed, moved to different parents and removed
- New albums can be added as child or root albums
- Lists people
- Shows a list of person groups, each with a collapsible list of people
- Groups can be created, renamed and removed
- People can be created within a group, renamed, moved to a different group and removed
- People can be opened
- List geotag areas
- Persistent on large screens, temporary on small screens
- Address bar
- Shows current folder/person/album path
- Has back, forward, "up" and "home" (root folders) buttons
- Contains a search bar
- Main files container
- Items can be selected and modified (see Sorting capabilities)
- Allow renaming of files
- Allow creation of albums from within 'Add to album' dialog
- Show details for selected items
- Different views
- Map view
- Option to show files containing person or faces within folder
- Items can be selected and modified (see Sorting capabilities)
- Open file
- Image files can be displayed full screen
- Images can be panned and zoomed
- Users can move forwards and backwards through a list of images
- Display outlines of faces in images
- Show options menu for open images
- Allow other file types to be opened
- Image files can be displayed full screen
- Accessibility
- Make context menu available anywhere in page
- Make keystrokes for most features
- Users can upload files to certain folders
- Users can download files/folders/albums
- Provide a progress bar for large downloads
- Navigation drawer
- Navigation
- 3 main hiearachies
- Folders
- Displays folders and files in separate lists
- Option to show all files in subfolders, rather than just immediate children
- People
- Displays faces for different people
- Optionally show files belonging to a person
- Albums
- Displays all files in an album and its children
- List child albums
- Folders
- Separate view for scanned photos
- Editor with cropping function
- Allow crop lines to be deleted
- Editor with cropping function
- Filtering
- Searching
- Files
- Found using file name, and names of related people, geotags, albums and folders
- Folders
- Found using folder name
- Find using name of any parent folder
- Allow searching of faces (via their file)
- Can search search only immediate children, or optionally all subfolder contents
- Files
- (possibly) More explicit filtering system
- Searching
- Access to all objects limited by user groups
- Guest access available through url-based authorisation
- Allow users to create access groups and/or urls
- Distinguish between read and write access
- Note: access groups currently behave 'as the user expects' - nothing is automatically changed unless requested. This can allow for odd behaviour, but it is at least fully user-controlled behaviour. It might make sense to remove access groups for folders/albums/people/etc. and instead just look at which files a user has access to, and whether any are included in that album/folder/person/etc.
- 3 main hiearachies
- Cross-platform
- Web
- Mobile application
- Use Cordova to package for mobile
- Use React-Native to build native application
- Desktop application
- Use Electron to package for desktop
- (possibly) Use Proton-Native to build native application
- Local (mobile and desktop) features
- Synchronise files to display images faster
- Synchronise full database to allow offline usage
- Allow fully local usage with local-only files
- Some issues with ordering - e.g. user-uploaded files are not ordered correctly until after refreshing the page
- TSC errors
- Currently album paths are computed locally rather than exposed in the API. This means that if a user has access to a child album but not its parent, then the full path is not displayed. Not sure if this is a bug or a feature.
Any contribution would be welcomed and greatly appreciated, even if just in the form of suggestions/bug reports.