Repository files navigation

Remote Photo Management System

Build StatusCode Style: Prettier

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.

Installation

  1. Install NPM
  2. Clone this repository (git clone https://github.com/zsmith3/Photo-Manager-Client/) and enter the directory (cd Photo-Manager-Client)
  3. Install NPM dependencies (npm install)
  4. Get a Google Maps Javascript API Key (see here) and add it to the ./build_config.js file.
  5. For Cordova:
    • Install Cordova globally (npm install -g cordova)
    • Enter the cordova directory (cd cordova) and run mkdir www then cordova 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 and cordova-splash
    • Install external requirements to build to certain platforms (e.g. see here for Android)

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.

Building

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 to
  • publicUrl - The (relative) public URL at which files will be hosted
  • preScript - The local path to an HTML file, containing any additional content which should be injected into the output index.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.

Features/To-Do

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
    • 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
  • 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
    • 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
    • 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
    • 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
    • Separate view for scanned photos
      • Editor with cropping function
        • Allow crop lines to be deleted
    • 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
      • (possibly) More explicit filtering system
    • 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.
  • 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

Known bugs

  • 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.

Contributing

Any contribution would be welcomed and greatly appreciated, even if just in the form of suggestions/bug reports.

About

A self-hosted online photo management system (in development)

Resources

Stars

1 star

Watchers

2 watching

Forks

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Remote Photo Management System

Build StatusCode Style: Prettier

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.

Installation

  1. Install NPM
  2. Clone this repository (git clone https://github.com/zsmith3/Photo-Manager-Client/) and enter the directory (cd Photo-Manager-Client)
  3. Install NPM dependencies (npm install)
  4. Get a Google Maps Javascript API Key (see here) and add it to the ./build_config.js file.
  5. For Cordova:
    • Install Cordova globally (npm install -g cordova)
    • Enter the cordova directory (cd cordova) and run mkdir www then cordova 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 and cordova-splash
    • Install external requirements to build to certain platforms (e.g. see here for Android)

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.

Building

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 to
  • publicUrl - The (relative) public URL at which files will be hosted
  • preScript - The local path to an HTML file, containing any additional content which should be injected into the output index.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.

Features/To-Do

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
    • 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
  • 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
    • 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
    • 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
    • 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
    • Separate view for scanned photos
      • Editor with cropping function
        • Allow crop lines to be deleted
    • 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
      • (possibly) More explicit filtering system
    • 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.
  • 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

Known bugs

  • 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.

Contributing

Any contribution would be welcomed and greatly appreciated, even if just in the form of suggestions/bug reports.

About

A self-hosted online photo management system (in development)

Resources

Stars

1 star

Watchers

2 watching

Forks

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Remote Photo Management System

Build StatusCode Style: Prettier

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.

Installation

  1. Install NPM
  2. Clone this repository (git clone https://github.com/zsmith3/Photo-Manager-Client/) and enter the directory (cd Photo-Manager-Client)
  3. Install NPM dependencies (npm install)
  4. Get a Google Maps Javascript API Key (see here) and add it to the ./build_config.js file.
  5. For Cordova:
    • Install Cordova globally (npm install -g cordova)
    • Enter the cordova directory (cd cordova) and run mkdir www then cordova 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 and cordova-splash
    • Install external requirements to build to certain platforms (e.g. see here for Android)

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.

Building

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 to
  • publicUrl - The (relative) public URL at which files will be hosted
  • preScript - The local path to an HTML file, containing any additional content which should be injected into the output index.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.

Features/To-Do

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
    • 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
  • 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
    • 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
    • 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
    • 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
    • Separate view for scanned photos
      • Editor with cropping function
        • Allow crop lines to be deleted
    • 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
      • (possibly) More explicit filtering system
    • 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.
  • 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

Known bugs

  • 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.

Contributing

Any contribution would be welcomed and greatly appreciated, even if just in the form of suggestions/bug reports.

About

A self-hosted online photo management system (in development)

Resources

Stars

1 star

Watchers

2 watching

Forks

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Remote Photo Management System

Build StatusCode Style: Prettier

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.

Installation

  1. Install NPM
  2. Clone this repository (git clone https://github.com/zsmith3/Photo-Manager-Client/) and enter the directory (cd Photo-Manager-Client)
  3. Install NPM dependencies (npm install)
  4. Get a Google Maps Javascript API Key (see here) and add it to the ./build_config.js file.
  5. For Cordova:
    • Install Cordova globally (npm install -g cordova)
    • Enter the cordova directory (cd cordova) and run mkdir www then cordova 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 and cordova-splash
    • Install external requirements to build to certain platforms (e.g. see here for Android)

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.

Building

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 to
  • publicUrl - The (relative) public URL at which files will be hosted
  • preScript - The local path to an HTML file, containing any additional content which should be injected into the output index.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.

Features/To-Do

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
    • 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
  • 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
    • 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
    • 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
    • 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
    • Separate view for scanned photos
      • Editor with cropping function
        • Allow crop lines to be deleted
    • 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
      • (possibly) More explicit filtering system
    • 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.
  • 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

Known bugs

  • 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.

Contributing

Any contribution would be welcomed and greatly appreciated, even if just in the form of suggestions/bug reports.

About

A self-hosted online photo management system (in development)

Resources

Stars

1 star

Watchers

2 watching

Forks

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Remote Photo Management System

Build StatusCode Style: Prettier

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.

Installation

  1. Install NPM
  2. Clone this repository (git clone https://github.com/zsmith3/Photo-Manager-Client/) and enter the directory (cd Photo-Manager-Client)
  3. Install NPM dependencies (npm install)
  4. Get a Google Maps Javascript API Key (see here) and add it to the ./build_config.js file.
  5. For Cordova:
    • Install Cordova globally (npm install -g cordova)
    • Enter the cordova directory (cd cordova) and run mkdir www then cordova 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 and cordova-splash
    • Install external requirements to build to certain platforms (e.g. see here for Android)

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.

Building

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 to
  • publicUrl - The (relative) public URL at which files will be hosted
  • preScript - The local path to an HTML file, containing any additional content which should be injected into the output index.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.

Features/To-Do

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
    • 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
  • 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
    • 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
    • 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
    • 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
    • Separate view for scanned photos
      • Editor with cropping function
        • Allow crop lines to be deleted
    • 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
      • (possibly) More explicit filtering system
    • 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.
  • 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

Known bugs

  • 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.

Contributing

Any contribution would be welcomed and greatly appreciated, even if just in the form of suggestions/bug reports.

About

A self-hosted online photo management system (in development)

Resources

Stars

1 star

Watchers

2 watching

Forks

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Remote Photo Management System

Build StatusCode Style: Prettier

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.

Installation

  1. Install NPM
  2. Clone this repository (git clone https://github.com/zsmith3/Photo-Manager-Client/) and enter the directory (cd Photo-Manager-Client)
  3. Install NPM dependencies (npm install)
  4. Get a Google Maps Javascript API Key (see here) and add it to the ./build_config.js file.
  5. For Cordova:
    • Install Cordova globally (npm install -g cordova)
    • Enter the cordova directory (cd cordova) and run mkdir www then cordova 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 and cordova-splash
    • Install external requirements to build to certain platforms (e.g. see here for Android)

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.

Building

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 to
  • publicUrl - The (relative) public URL at which files will be hosted
  • preScript - The local path to an HTML file, containing any additional content which should be injected into the output index.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.

Features/To-Do

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
    • 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
  • 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
    • 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
    • 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
    • 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
    • Separate view for scanned photos
      • Editor with cropping function
        • Allow crop lines to be deleted
    • 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
      • (possibly) More explicit filtering system
    • 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.
  • 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

Known bugs

  • 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.

Contributing

Any contribution would be welcomed and greatly appreciated, even if just in the form of suggestions/bug reports.

About

A self-hosted online photo management system (in development)

Resources

Stars

1 star

Watchers

2 watching

Forks

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Remote Photo Management System

Build StatusCode Style: Prettier

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.

Installation

  1. Install NPM
  2. Clone this repository (git clone https://github.com/zsmith3/Photo-Manager-Client/) and enter the directory (cd Photo-Manager-Client)
  3. Install NPM dependencies (npm install)
  4. Get a Google Maps Javascript API Key (see here) and add it to the ./build_config.js file.
  5. For Cordova:
    • Install Cordova globally (npm install -g cordova)
    • Enter the cordova directory (cd cordova) and run mkdir www then cordova 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 and cordova-splash
    • Install external requirements to build to certain platforms (e.g. see here for Android)

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.

Building

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 to
  • publicUrl - The (relative) public URL at which files will be hosted
  • preScript - The local path to an HTML file, containing any additional content which should be injected into the output index.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.

Features/To-Do

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
    • 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
  • 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
    • 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
    • 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
    • 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
    • Separate view for scanned photos
      • Editor with cropping function
        • Allow crop lines to be deleted
    • 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
      • (possibly) More explicit filtering system
    • 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.
  • 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

Known bugs

  • 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.

Contributing

Any contribution would be welcomed and greatly appreciated, even if just in the form of suggestions/bug reports.

About

A self-hosted online photo management system (in development)

Resources

Stars

1 star

Watchers

2 watching

Forks

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Remote Photo Management System

Build StatusCode Style: Prettier

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.

Installation

  1. Install NPM
  2. Clone this repository (git clone https://github.com/zsmith3/Photo-Manager-Client/) and enter the directory (cd Photo-Manager-Client)
  3. Install NPM dependencies (npm install)
  4. Get a Google Maps Javascript API Key (see here) and add it to the ./build_config.js file.
  5. For Cordova:
    • Install Cordova globally (npm install -g cordova)
    • Enter the cordova directory (cd cordova) and run mkdir www then cordova 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 and cordova-splash
    • Install external requirements to build to certain platforms (e.g. see here for Android)

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.

Building

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 to
  • publicUrl - The (relative) public URL at which files will be hosted
  • preScript - The local path to an HTML file, containing any additional content which should be injected into the output index.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.

Features/To-Do

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
    • 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
  • 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
    • 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
    • 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
    • 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
    • Separate view for scanned photos
      • Editor with cropping function
        • Allow crop lines to be deleted
    • 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
      • (possibly) More explicit filtering system
    • 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.
  • 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

Known bugs

  • 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.

Contributing

Any contribution would be welcomed and greatly appreciated, even if just in the form of suggestions/bug reports.

About

A self-hosted online photo management system (in development)

Resources

Stars

1 star

Watchers

2 watching

Forks

Used by

Contributors

Languages