Photo gallery for self-hosted personal servers

Overview

photoview logo

License GitHub contributors Docker Pulls Docker Build Status

screenshot

Photoview is a simple and user-friendly photo gallery that can easily be installed on personal servers. It's made for photographers and aims to provide an easy and fast way to navigate directories, with thousands of high resolution photos.

If you have questions regarding setup or development, feel free to join the Discord server https://discord.gg/jQ392948u9

Demo site

Visit https://photos.qpqp.dk/

Username: demo Password: demo

Contents

Main features

  • Closely tied to the file system. The website presents the images found on the local filesystem of the server, directories are mapped to albums.
  • User management. Each user is created along with a path on the local filesystem, photos within that path can be accessed by that user.
  • Sharing. Albums, as well as individual media, can easily be shared with a public link, the link can optinally be password protected.
  • Made for photography. Photoview is built with photographers in mind, and thus supports RAW file formats, and EXIF parsing.
  • Video support. Many common video formats are supported. Videos will automatically be optimized for web.
  • Face recognition. Faces will automatically be detected in photos, and photos of the same person will be grouped together.
  • Performant. Thumbnails are automatically generated and photos first load when they are visible on the screen. In full screen, thumbnails are displayed until the high resolution image has been fully loaded.
  • Secure. All media resources are protected with a cookie-token, all passwords are properly hashed, and the API uses a strict CORS policy.

Why yet another self-hosted photo gallery

There exists a lot of open-source self-hosted photo galleries already. Here are some, just to mention a few.

So why another one? I love taking photos, and I store all of them on my local fileserver. This is great because I can organize my photos directly on the filesystem so it's easy to move them or take backups. I want to be able to control where and how the photos are stored.

The problem is however that RAW images are extremely tedious to navigate from a fileserver, even over the local network.

My server holds a lot of old family pictures, that I would like my family to have access to as well. And some of the pictures I would like to easily be able to share with other people without the hassle of them having to make an account first.

Thus I need a solution that can do the following:

  • A scan based approach that automatically organises my photos
  • Support RAW and EXIF parsing
  • Have support for multiple users and ways to share albums and photos also publicly
  • Be simple and fast to use

All of the photo galleries can do a lot of what I need, but no single one can do it all.

Getting started - Setup with Docker

This section describes how to get Photoview up and running on your server with Docker. Make sure you have Docker and docker-compose installed and running on your server

  1. Make a new docker-compose.yml file on your computer, and copy the content of docker-compose.example.yml to the new file.
  2. Edit docker-compose.yml, find the comments starting with Change This:, and change the values, to properly match your setup. If you are just testing locally, you don't have to change anything.
  3. Start the server by running the following command
$ docker-compose up -d

If the endpoint or the port hasn't been changed in the docker-compose.yml file, Photoview can now be accessed at http://localhost:8000

Initial Setup

If everything is setup correctly, you should be presented with an initial setup wizard, when accessing the website the first time.

Initial setup

Enter a new username and password.

For the photo path, enter the path in the docker container where your photos are located. This can be set from the docker-compose.yml file under api -> volumes. The default location is /photos

A new admin user will be created, with access to the photos located at the path provided under the initial setup.

The photos will have to be scanned before they show up, you can start a scan manually, by navigating to Settings and clicking on Scan All

Setup development environment

Local setup

  1. Install a local mysql server, and make a new database
  2. Rename /api/example.env to .env and update the MYSQL_URL field
  3. Rename /ui/example.env to .env

Start API server

Make sure golang is installed.

Some C libraries are needed to compile the API, see go-face requirements for more details. They can be installed as shown below:

# Ubuntu
sudo apt-get install libdlib-dev libblas-dev liblapack-dev libjpeg-turbo8-dev
# Debian
sudo apt-get install libdlib-dev libblas-dev liblapack-dev libjpeg62-turbo-dev
# macOS
brew install dlib

Then run the following commands:

cd ./api && go run server.go

Start UI server

Make sure node is installed. In a new terminal window run the following commands:

cd ./ui && npm start

The site can now be accessed at localhost:1234. And the graphql playground at localhost:4001

Sponsors


@ericerkz

@robin-moser
Issues
  • ERROR: Error detecting faces in image (/photos/photo/IMG_20210214_135111.jpg): thumbnail url is missing

    ERROR: Error detecting faces in image (/photos/photo/IMG_20210214_135111.jpg): thumbnail url is missing

    I am running photoview use viktorstrate/photoview:nightly by docker. When I scanning the media. I get a lot of error logs. Here are some of the logs.

    2021/02/23 23:35:34 Broadcasting notification: Processing media for album 'photo'
    
    2021/02/23 23:35:34 ERROR: Error detecting faces in image (/photos/photo/IMG20200620092818.jpg): thumbnail url is missing
    
    2021/02/23 23:35:34 Broadcasting notification: Scanner error
    
    2021/02/23 23:35:34 Processing photo: /photos/photo/IMG20200712195828.jpg
    
    2021/02/23 23:35:34 Broadcasting notification: Processing media for album 'photo'
    
    2021/02/23 23:35:34 ERROR: Error detecting faces in image (/photos/photo/IMG20200712195828.jpg): thumbnail url is missing
    
    2021/02/23 23:35:34 Broadcasting notification: Scanner error
    
    2021/02/23 23:35:34 Processing photo: /photos/photo/IMG_20200615_102815.jpg
    
    2021/02/23 23:35:34 Broadcasting notification: Processing media for album 'photo'
    
    2021/02/23 23:35:34 ERROR: Error detecting faces in image (/photos/photo/IMG_20200615_102815.jpg): thumbnail url is missing
    
    2021/02/23 23:35:34 Broadcasting notification: Scanner error
    
    2021/02/23 23:35:34 Processing photo: /photos/photo/IMG_20200615_195912.jpg
    
    2021/02/23 23:35:34 Broadcasting notification: Processing media for album 'photo'
    
    2021/02/23 23:35:34 ERROR: Error detecting faces in image (/photos/photo/IMG_20200615_195912.jpg): thumbnail url is missing
    
    2021/02/23 23:35:34 Broadcasting notification: Scanner error
    
    2021/02/23 23:35:34 Processing photo: /photos/photo/IMG_20200618_165327.jpg
    
    2021/02/23 23:35:34 Broadcasting notification: Processing media for album 'photo'
    
    2021/02/23 23:35:34 ERROR: Error detecting faces in image (/photos/photo/IMG_20200618_165327.jpg): thumbnail url is missing
    
    2021/02/23 23:35:34 Broadcasting notification: Scanner error
    
    2021/02/23 23:35:34 Processing photo: /photos/photo/IMG_20200620_092843.jpg
    
    2021/02/23 23:35:35 Broadcasting notification: Processing media for album 'photo'
    
    2021/02/23 23:35:35 ERROR: Error detecting faces in image (/photos/photo/IMG_20200620_092843.jpg): thumbnail url is missing
    
    2021/02/23 23:35:35 Broadcasting notification: Scanner error
    
    2021/02/23 23:35:35 Processing photo: /photos/photo/IMG_20200620_092938.jpg
    
    2021/02/23 23:35:35 Broadcasting notification: Processing media for album 'photo'
    
    2021/02/23 23:35:35 ERROR: Error detecting faces in image (/photos/photo/IMG_20200620_092938.jpg): thumbnail url is missing
    
    2021/02/23 23:35:35 Broadcasting notification: Scanner error
    
    2021/02/23 23:35:35 Processing photo: /photos/photo/IMG_20200620_093107.jpg
    
    2021/02/23 23:35:35 Broadcasting notification: Processing media for album 'photo'
    
    2021/02/23 23:35:35 ERROR: Error detecting faces in image (/photos/photo/IMG_20200620_093107.jpg): thumbnail url is missing
    
    2021/02/23 23:35:35 Broadcasting notification: Scanner error
    
    2021/02/23 23:35:35 Processing photo: /photos/photo/IMG_20200620_093439.jpg
    
    2021/02/23 23:35:35 Broadcasting notification: Processing media for album 'photo'
    
    2021/02/23 23:35:35 ERROR: Error detecting faces in image (/photos/photo/IMG_20200620_093439.jpg): thumbnail url is missing
    
    2021/02/23 23:35:35 Broadcasting notification: Scanner error
    
    2021/02/23 23:35:35 Processing photo: /photos/photo/IMG_20200620_103029.jpg
    
    2021/02/23 23:35:35 Broadcasting notification: Processing media for album 'photo'
    
    2021/02/23 23:35:35 ERROR: Error detecting faces in image (/photos/photo/IMG_20200620_103029.jpg): thumbnail url is missing
    
    2021/02/23 23:35:35 Broadcasting notification: Scanner error
    
    2021/02/23 23:35:35 Processing photo: /photos/photo/IMG_20200620_103126.jpg
    
    2021/02/23 23:35:35 Broadcasting notification: Processing media for album 'photo'
    
    2021/02/23 23:35:35 ERROR: Error detecting faces in image (/photos/photo/IMG_20200620_103126.jpg): thumbnail url is missing
    
    2021/02/23 23:35:35 Broadcasting notification: Scanner error
    
    bug high priority 
    opened by beermedlar 19
  • Define max key length of 11 in mysql migrations

    Define max key length of 11 in mysql migrations

    This closes #23

    @BkSouX I've updated the database migrations to explicitly set a max length for all keys in the database.

    Would you please try to install this branch on your ARM setup to test if this solves your issue?

    Note that you will have to wipe the database and let the migration set it up again

    opened by viktorstrate 16
  • Database connection problems with docker-compose

    Database connection problems with docker-compose

    Multiple have reported connection issues with docker-compose

    I think it is a connection problem between the api and the database (mariadb). Please note the database version 10.4.12-MariaDB-1:10.4.12+maria~bionic This might be a related issue https://github.com/docker-library/mariadb/issues/262

    Replication

    I have just tried to replicate the issue but everything seems to work fine. See console output below.

    Can someone please try to replicate it by running

    # Delete all previous volumes 
    $ docker-compose down -v
    
    # Recreate the containers from scratch
    $ docker-compose up --force-recreate --build
    

    When the api container prints database migrated, please navigate to http://localhost:8080, and you should be redirected to the initial setup wizard

    Output log
    $ cp docker-compose.example.yml docker-compose.yml
    $ docker-compose up
    Creating network "photoview_default" with the default driver
    Creating volume "photoview_db_data" with default driver
    Creating volume "photoview_api_cache" with default driver
    Creating photoview_db_1 ... done
    Creating photoview_api_1 ... done
    Creating photoview_ui_1  ... done
    Creating photoview_proxy_1 ... done
    Attaching to photoview_db_1, photoview_api_1, photoview_ui_1, photoview_proxy_1
    api_1    | 2020/03/02 14:22:03 Connecting to database: photoview:[email protected](db)/photoview?multiStatements=true&parseTime=true
    db_1     | 2020-03-02 14:22:03+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 1:10.4.12+maria~bionic started.
    db_1     | 2020-03-02 14:22:03+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
    api_1    | 2020/03/02 14:22:03 Could not ping database: dial tcp 172.19.0.2:3306: connect: connection refused. Will retry after 1 second
    db_1     | 2020-03-02 14:22:03+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 1:10.4.12+maria~bionic started.
    db_1     | 2020-03-02 14:22:03+00:00 [Note] [Entrypoint]: Initializing database files
    api_1    | 2020/03/02 14:22:04 Could not ping database: dial tcp 172.19.0.2:3306: connect: connection refused. Will retry after 1 second
    api_1    | 2020/03/02 14:22:05 Could not ping database: dial tcp 172.19.0.2:3306: connect: connection refused. Will retry after 1 second
    db_1     |
    db_1     |
    db_1     | PLEASE REMEMBER TO SET A PASSWORD FOR THE MariaDB root USER !
    db_1     | To do so, start the server, then issue the following commands:
    db_1     |
    db_1     | '/usr/bin/mysqladmin' -u root password 'new-password'
    db_1     | '/usr/bin/mysqladmin' -u root -h  password 'new-password'
    db_1     |
    db_1     | Alternatively you can run:
    db_1     | '/usr/bin/mysql_secure_installation'
    db_1     |
    db_1     | which will also give you the option of removing the test
    db_1     | databases and anonymous user created by default.  This is
    db_1     | strongly recommended for production servers.
    db_1     |
    db_1     | See the MariaDB Knowledgebase at http://mariadb.com/kb or the
    db_1     | MySQL manual for more instructions.
    db_1     |
    db_1     | Please report any problems at http://mariadb.org/jira
    db_1     |
    db_1     | The latest information about MariaDB is available at http://mariadb.org/.
    db_1     | You can find additional information about the MySQL part at:
    db_1     | http://dev.mysql.com
    db_1     | Consider joining MariaDB's strong and vibrant community:
    db_1     | https://mariadb.org/get-involved/
    db_1     |
    db_1     | 2020-03-02 14:22:06+00:00 [Note] [Entrypoint]: Database files initialized
    db_1     | 2020-03-02 14:22:06+00:00 [Note] [Entrypoint]: Starting temporary server
    db_1     | 2020-03-02 14:22:06+00:00 [Note] [Entrypoint]: Waiting for server startup
    db_1     | 2020-03-02 14:22:06 0 [Note] mysqld (mysqld 10.4.12-MariaDB-1:10.4.12+maria~bionic) starting as process 122 ...
    db_1     | 2020-03-02 14:22:06 0 [Note] InnoDB: Using Linux native AIO
    db_1     | 2020-03-02 14:22:06 0 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
    db_1     | 2020-03-02 14:22:06 0 [Note] InnoDB: Uses event mutexes
    db_1     | 2020-03-02 14:22:06 0 [Note] InnoDB: Compressed tables use zlib 1.2.11
    db_1     | 2020-03-02 14:22:06 0 [Note] InnoDB: Number of pools: 1
    db_1     | 2020-03-02 14:22:06 0 [Note] InnoDB: Using SSE2 crc32 instructions
    db_1     | 2020-03-02 14:22:06 0 [Note] mysqld: O_TMPFILE is not supported on /tmp (disabling future attempts)
    db_1     | 2020-03-02 14:22:06 0 [Note] InnoDB: Initializing buffer pool, total size = 256M, instances = 1, chunk size = 128M
    db_1     | 2020-03-02 14:22:06 0 [Note] InnoDB: Completed initialization of buffer pool
    db_1     | 2020-03-02 14:22:06 0 [Note] InnoDB: If the mysqld execution user is authorized, page cleaner thread priority can be changed. See the man page of setpriority().
    db_1     | 2020-03-02 14:22:06 0 [Note] InnoDB: 128 out of 128 rollback segments are active.
    db_1     | 2020-03-02 14:22:06 0 [Note] InnoDB: Creating shared tablespace for temporary tables
    db_1     | 2020-03-02 14:22:06 0 [Note] InnoDB: Setting file './ibtmp1' size to 12 MB. Physically writing the file full; Please wait ...
    db_1     | 2020-03-02 14:22:06 0 [Note] InnoDB: File './ibtmp1' size is now 12 MB.
    db_1     | 2020-03-02 14:22:06 0 [Note] InnoDB: Waiting for purge to start
    db_1     | 2020-03-02 14:22:06 0 [Note] InnoDB: 10.4.12 started; log sequence number 60972; transaction id 21
    db_1     | 2020-03-02 14:22:06 0 [Note] InnoDB: Loading buffer pool(s) from /var/lib/mysql/ib_buffer_pool
    db_1     | 2020-03-02 14:22:06 0 [Note] Plugin 'FEEDBACK' is disabled.
    db_1     | 2020-03-02 14:22:06 0 [Warning] 'user' entry '[email protected]' ignored in --skip-name-resolve mode.
    db_1     | 2020-03-02 14:22:06 0 [Warning] 'user' entry '@0829d713736a' ignored in --skip-name-resolve mode.
    db_1     | 2020-03-02 14:22:06 0 [Warning] 'proxies_priv' entry '@% [email protected]' ignored in --skip-name-resolve mode.
    db_1     | 2020-03-02 14:22:06 0 [Note] InnoDB: Buffer pool(s) load completed at 200302 14:22:06
    db_1     | 2020-03-02 14:22:06 0 [Note] Reading of all Master_info entries succeeded
    db_1     | 2020-03-02 14:22:06 0 [Note] Added new Master_info '' to hash table
    db_1     | 2020-03-02 14:22:06 0 [Note] mysqld: ready for connections.
    db_1     | Version: '10.4.12-MariaDB-1:10.4.12+maria~bionic'  socket: '/var/run/mysqld/mysqld.sock'  port: 0  mariadb.org binary distribution
    api_1    | 2020/03/02 14:22:06 Could not ping database: dial tcp 172.19.0.2:3306: connect: connection refused. Will retry after 1 second
    db_1     | 2020-03-02 14:22:07+00:00 [Note] [Entrypoint]: Temporary server started.
    api_1    | 2020/03/02 14:22:07 ERROR: Could not ping database, exiting
    db_1     | Warning: Unable to load '/usr/share/zoneinfo/leap-seconds.list' as time zone. Skipping it.
    api_1    | 2020/03/02 14:22:08 Could not ping database: dial tcp 172.19.0.2:3306: connect: connection refused. Will retry after 1 second
    api_1    | 2020/03/02 14:22:09 Could not ping database: dial tcp 172.19.0.2:3306: connect: connection refused. Will retry after 1 second
    api_1    | 2020/03/02 14:22:10 Could not ping database: dial tcp 172.19.0.2:3306: connect: connection refused. Will retry after 1 second
    api_1    | 2020/03/02 14:22:11 ERROR: Could not ping database, exiting
    photoview_api_1 exited with code 1
    db_1     | 2020-03-02 14:22:13+00:00 [Note] [Entrypoint]: GENERATED ROOT PASSWORD: jeixeiM8Ahjee4phiathai7beith8boh
    db_1     | 2020-03-02 14:22:13 10 [Warning] 'proxies_priv' entry '@% [email protected]' ignored in --skip-name-resolve mode.
    db_1     | 2020-03-02 14:22:13+00:00 [Note] [Entrypoint]: Creating database photoview
    db_1     | 2020-03-02 14:22:13+00:00 [Note] [Entrypoint]: Creating user photoview
    db_1     | 2020-03-02 14:22:13+00:00 [Note] [Entrypoint]: Giving user photoview access to schema photoview
    db_1     | 2020-03-02 14:22:13 14 [Warning] 'proxies_priv' entry '@% [email protected]' ignored in --skip-name-resolve mode.
    db_1     |
    db_1     | 2020-03-02 14:22:13+00:00 [Note] [Entrypoint]: Stopping temporary server
    db_1     | 2020-03-02 14:22:13 0 [Note] mysqld (initiated by: root[root] @ localhost []): Normal shutdown
    db_1     | 2020-03-02 14:22:13 0 [Note] Event Scheduler: Purging the queue. 0 events
    db_1     | 2020-03-02 14:22:13 0 [Note] InnoDB: FTS optimize thread exiting.
    db_1     | 2020-03-02 14:22:13 0 [Note] InnoDB: Starting shutdown...
    db_1     | 2020-03-02 14:22:13 0 [Note] InnoDB: Dumping buffer pool(s) to /var/lib/mysql/ib_buffer_pool
    db_1     | 2020-03-02 14:22:13 0 [Note] InnoDB: Buffer pool(s) dump completed at 200302 14:22:13
    api_1    | 2020/03/02 14:22:13 Could not ping database: dial tcp 172.19.0.2:3306: connect: connection refused. Will retry after 1 second
    db_1     | 2020-03-02 14:22:14 0 [Note] InnoDB: Shutdown completed; log sequence number 60981; transaction id 24
    db_1     | 2020-03-02 14:22:14 0 [Note] InnoDB: Removed temporary tablespace data file: "ibtmp1"
    db_1     | 2020-03-02 14:22:14 0 [Note] mysqld: Shutdown complete
    db_1     |
    db_1     | 2020-03-02 14:22:14+00:00 [Note] [Entrypoint]: Temporary server stopped
    db_1     |
    db_1     | 2020-03-02 14:22:14+00:00 [Note] [Entrypoint]: MySQL init process done. Ready for start up.
    db_1     |
    db_1     | 2020-03-02 14:22:14 0 [Note] mysqld (mysqld 10.4.12-MariaDB-1:10.4.12+maria~bionic) starting as process 1 ...
    db_1     | 2020-03-02 14:22:14 0 [Note] InnoDB: Using Linux native AIO
    db_1     | 2020-03-02 14:22:14 0 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
    db_1     | 2020-03-02 14:22:14 0 [Note] InnoDB: Uses event mutexes
    db_1     | 2020-03-02 14:22:14 0 [Note] InnoDB: Compressed tables use zlib 1.2.11
    db_1     | 2020-03-02 14:22:14 0 [Note] InnoDB: Number of pools: 1
    db_1     | 2020-03-02 14:22:14 0 [Note] InnoDB: Using SSE2 crc32 instructions
    db_1     | 2020-03-02 14:22:14 0 [Note] mysqld: O_TMPFILE is not supported on /tmp (disabling future attempts)
    db_1     | 2020-03-02 14:22:14 0 [Note] InnoDB: Initializing buffer pool, total size = 256M, instances = 1, chunk size = 128M
    db_1     | 2020-03-02 14:22:14 0 [Note] InnoDB: Completed initialization of buffer pool
    db_1     | 2020-03-02 14:22:14 0 [Note] InnoDB: If the mysqld execution user is authorized, page cleaner thread priority can be changed. See the man page of setpriority().
    db_1     | 2020-03-02 14:22:14 0 [Note] InnoDB: 128 out of 128 rollback segments are active.
    db_1     | 2020-03-02 14:22:14 0 [Note] InnoDB: Creating shared tablespace for temporary tables
    db_1     | 2020-03-02 14:22:14 0 [Note] InnoDB: Setting file './ibtmp1' size to 12 MB. Physically writing the file full; Please wait ...
    db_1     | 2020-03-02 14:22:14 0 [Note] InnoDB: File './ibtmp1' size is now 12 MB.
    db_1     | 2020-03-02 14:22:14 0 [Note] InnoDB: Waiting for purge to start
    api_1    | 2020/03/02 14:22:14 Could not ping database: dial tcp 172.19.0.2:3306: connect: connection refused. Will retry after 1 second
    db_1     | 2020-03-02 14:22:14 0 [Note] InnoDB: 10.4.12 started; log sequence number 60981; transaction id 21
    db_1     | 2020-03-02 14:22:14 0 [Note] InnoDB: Loading buffer pool(s) from /var/lib/mysql/ib_buffer_pool
    db_1     | 2020-03-02 14:22:14 0 [Note] Plugin 'FEEDBACK' is disabled.
    db_1     | 2020-03-02 14:22:14 0 [Note] Server socket created on IP: '::'.
    db_1     | 2020-03-02 14:22:14 0 [Warning] 'proxies_priv' entry '@% [email protected]' ignored in --skip-name-resolve mode.
    db_1     | 2020-03-02 14:22:14 0 [Note] InnoDB: Buffer pool(s) load completed at 200302 14:22:14
    db_1     | 2020-03-02 14:22:14 0 [Note] Reading of all Master_info entries succeeded
    db_1     | 2020-03-02 14:22:14 0 [Note] Added new Master_info '' to hash table
    db_1     | 2020-03-02 14:22:14 0 [Note] mysqld: ready for connections.
    db_1     | Version: '10.4.12-MariaDB-1:10.4.12+maria~bionic'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  mariadb.org binary distribution
    api_1    | 2020/03/02 14:22:15 Database migrated
    api_1    | 2020/03/02 14:22:15 🚀 Graphql playground ready at http://localhost:8080/api
    
    documentation docker 
    opened by viktorstrate 16
  • Update JPEGS on sidecar change

    Update JPEGS on sidecar change

    Changes

    HighRes and thumbnail JPEGs now update when the RAW sidecar (.xmp) file changes

    How

    Darktable CLI already uses the sidecar file if it can find it, however photoview has no idea if the sidecar file has changed so I hashed the file and stored it in the DB to detect changes, if a change is detected I delete the old highres and thumbnail and re-encode them. Due to Darktable already using the xmp file if it found it I have left the call to Darktable unchanged as explicitly passing Darktable the .xmp file causes Darktable to fail if there is any problem with the .xmp file compared to now where it falls back to just encoding the picture as it is)

    Bug

    After making the changes I realised getting the size for my raw files (NEF) is incorrect, however they would be incorrect anyway if I had a crop in the .xmp file as the previous method encoded the high res JPEG and then read the dimensions from the new JPEG. I changed it to read the dimensions directly from the raw file but I think it is reading the dimensions of the embedded JPEG thumbnail (as the sizes reported are 160x120 instead of (4282x2844). I plan to resolve this but wanted to get a sense if the JPEG update feature was something we wanted in the first place.

    I have very little experience in Go if you would like anything changed please let me know I am happy to make many changes. We most likely want to store the hash/path in a separate table or the hashSideCarFile function may want to live somewhere else, happy to move them to wherever is recommended.

    API 
    opened by seam345 15
  • docker-compose database connection error

    docker-compose database connection error

    I'm getting the following error when starting the container. I am using the hostname of the database because it doesn't use a static IP. I've tried different formatting unsuccessfully .

    2020/08/14 12:21:43 Could not connect to database: Could not parse mysql url: parse "photoviewdb_user:[email protected](mariadb)/photoview": first path segment in URL cannot contain colon,
    panic: Could not connect to database: Could not parse mysql url: parse "photoviewdb_user:[email protected](mariadb)/photoview": first path segment in URL cannot contain colon
    
    help wanted docker 
    opened by tehniemer 13
  • HEIC and HEVC support

    HEIC and HEVC support

    Any plans to support these formats for iPhone users?

    API 
    opened by narensankar0529 13
  • add ignored path / excluded folders

    add ignored path / excluded folders

    I decided to run photoview on my personal photo library stored on the Synology NAS. Most of the folders on the Synology have @eaDir folder with some system information. That results in the scanner erros:

    2020/04/16 01:35:16 ERROR: Could not read file /photos/2004/2004 10 Massachusets wedding/@eaDir/Свадьба Витали Лены''''''Фото Тимофея [email protected]: EOF
    2020/04/16 01:35:16 Broadcasting notification: Scanner error
    2020/04/16 01:35:16 ERROR: Could not read file /photos/2004/2004 10 Massachusets wedding/@eaDir/Свадьба Витали Лены''''''Фото Тимофея [email protected]: EOF
    2020/04/16 01:35:16 Broadcasting notification: Scanner error
    

    I suggest to have some env setting (in config / db / somewhere ...), with list of ignored folders. And perhaps have some folder there included by defaults, such as:

    @eaDir 
    #snapshot
    #recycle
    
    feature scanner 
    opened by SlavikCA 12
  • standard_init_linux.go:211: exec user process caused

    standard_init_linux.go:211: exec user process caused "exec format error"

    I have just tried to get this running on OMV5 (Debian Buster) / ARMv7 using the Docker compose.

    The Docker PhotoView logs show this:

    standard_init_linux.go:211: exec user process caused "exec format error"
    

    I can't access the server on the local network using it's IP (http://10.0.0.3:8088). I changed the port configuration in Docker below. The container itself keeps restarting.

    curl http://10.0.0.3:8088
    curl: (7) Failed to connect to 10.0.0.3 port 8088: Connection refused
    

    I'm using the linuxserver/mariadb image because the stock mariadb image doesn't have an ARMv7 build.

    Here's my docker-compose

    version: "3"
    
    services:
      db:
        image: linuxserver/mariadb
        container_name: mariadb
        environment:
          - PUID=1000
          - PGID=100
          - MYSQL_ROOT_PASSWORD=1234
          - TZ=America/Santiago
          - MYSQL_DATABASE=photoview
          - MYSQL_USER=photoview 
          - MYSQL_PASSWORD=abcd 
        volumes:
          - db_data:/config
        ports:
          - 3306:3306
        restart: unless-stopped
    
      photoview:
        image: viktorstrate/photoview:latest
        container_name: photoview
        restart: always
        ports:
          - "8088:80"
        depends_on:
          - db
        environment:
          - MYSQL_URL=photoview:[email protected](db)/photoview
          - API_LISTEN_IP=photoview
          - API_LISTEN_PORT=80
          - PHOTO_CACHE=/app/cache
          - PUBLIC_ENDPOINT=http://10.0.0.3:80/
        volumes:
          - api_cache:/app/cache
          - /srv/dev-disk-by-label-NASHD/Photos/test:/photos:ro
    
    volumes:
      db_data:
      api_cache:
    

    I've tried the PUBLIC_ENDPOINT commented out completely, and on both ports 80 and 8088.

    The mariadb logs don't show any errors

    [s6-init] making user provided files available at /var/run/s6/etc...exited 0.,
    [s6-init] ensuring user provided files have correct perms...exited 0.,
    [fix-attrs.d] applying ownership & permissions fixes...,
    [fix-attrs.d] done.,
    [cont-init.d] executing container initialization scripts...,
    [cont-init.d] 01-envfile: executing... ,
    [cont-init.d] 01-envfile: exited 0.,
    [cont-init.d] 10-adduser: executing... ,
    ,
    -------------------------------------,
              _         (),
             | |  ___   _    __,
             | | / __| | |  /  \ ,
             | | \__ \ | | | () |,
             |_| |___/ |_|  \__/,
    ,
    ,
    Brought to you by linuxserver.io,
    -------------------------------------,
    ,
    To support LSIO projects visit:,
    https://www.linuxserver.io/donate/,
    -------------------------------------,
    GID/UID,
    -------------------------------------,
    ,
    User uid:    1000,
    User gid:    100,
    -------------------------------------,
    ,
    [cont-init.d] 10-adduser: exited 0.,
    [cont-init.d] 30-config: executing... ,
    [cont-init.d] 30-config: exited 0.,
    [cont-init.d] 40-initialise-db: executing... ,
    [cont-init.d] 40-initialise-db: exited 0.,
    [cont-init.d] 99-custom-scripts: executing... ,
    [custom-init] no custom files found exiting...,
    [cont-init.d] 99-custom-scripts: exited 0.,
    [cont-init.d] done.,
    [services.d] starting services,
    [services.d] done.,
    200922 16:27:11 mysqld_safe Logging to syslog.,
    200922 16:27:11 mysqld_safe Starting mysqld daemon with databases from /config/databases,
    
    arm 
    opened by gabrielwhite 10
  • Favourite images

    Favourite images

    • [x] When the heart icon on a photo is clicked, the image should be favourited so it is easier to find.
    • [x] There should be a way to filter favourited photos. Maybe a link in the sidebar?
    feature 
    opened by viktorstrate 10
  • Installation on Podman

    Installation on Podman

    As someone who ditched piwigo, I was excited to checkout photoview. But I'm on podman and not docker so docker compose won't work for me. I figured out the basics from the provided 'docker-compose.example.yml' and tried the command below:

    sudo podman run -dt --pod fox --name=photoview -p 8000:80 -e MYSQL_URL='root:[email protected](127.0.0.1)'/photoview -e API_LISTEN_IP=127.0.0.1 -e API_LISTEN_PORT=8000 -e PHOTO_CACHE=/app/cache -e SERVE_UI=1 -e PUBLIC_ENDPOINT=http://127.0.0.1:8000/ -v /public/Photos/cache:/app/cache:z -v /public/Photos:/photos:z --net=host docker.io/photoview
    

    Unfortunately I get this error when pulling the image:

    Trying to pull docker.io/photoview...
      denied: requested access to the resource is denied
    Error: error pulling image "docker.io/photoview": unable to pull docker.io/photoview: unable to pull image: Error initializing source docker://photoview:latest: Error reading manifest latest in docker.io/library/photoview: errors:
    denied: requested access to the resource is denied
    unauthorized: authentication required
    

    Do I need a docker account to pull the image? I tried searching the image manually in dockerhub but the only listed image that resembles what I'm looking for is 'r1chjames/photoview'. I downloaded it just to test and I get the error below:

    [email protected] ~]$ sudo podman logs photoview
    2020/04/29 11:03:39 No .env file found
    2020/04/29 11:03:39 Connecting to database: root:*******@tcp(127.0.0.1)/photoview?multiStatements=true&parseTime=true
    2020/04/29 11:03:39 Database is up to date
    2020/04/29 11:03:39 Photoview API endpoint listening at http://127.0.0.1:8000/api
    2020/04/29 11:03:39 Photoview API public endpoint ready at http://ke1i.duckdns.org:8000/api
    2020/04/29 11:03:39 Photoview UI public endpoint ready at http://ke1i.duckdns.org:8000/
    2020/04/29 11:03:54 GET 304 ke1i.local:8000/ 5.90317ms unauthenticated
    

    I get a blank page when I visit the public endpoint. So I know podman isn't the issue.

    Additional information:

    I already have a mariadb instance running (linuxserver.io one) and I've created a database named 'photoview' in it.

    opened by Ke1i 9
  • Disable face detection for album

    Disable face detection for album

    There are some albums where I would not want face detection.

    It would be great if face detection could be disabled per album (in the sidebar), per folder, or per user (in the settings).

    opened by edpiburkhart 0
  • Only 5 images per date visible when skipping through the timeline

    Only 5 images per date visible when skipping through the timeline

    Describe the bug Skipping from image to image through the timeline shows only up to 5 images per date.

    To Reproduce Steps to reproduce the behavior:

    1. In the timeline, open the last previewed image of a date with more than five images, by clicking on it. Like this one on the demo site: grafik

    2. Click on the right arrow, to jump to the next image from August 11th (we know there is one, the counter told us)

    3. Instead of the last image of August 11th, the application jumps directly to the first image from August 10th (the nice image of the Besseggen - the two lakes)

    Expected behavior Skipping from image to image in the timeline let's you move through the entire collection of images, sorted by capture date / time.

    Your environment: The demo site https://photos.qpqp.dk/photos, running version 2.3.6 (4af3d11d).

    Additional context Photoview is great, keep up the good work! :)

    bug 
    opened by ch-koehler 1
  • Image counter icon not updating

    Image counter icon not updating

    Describe the bug The image counter icon in the timeline, displaying the number of images not being displayed - I assume, seems to be fixed to total_number_of_images - 5, instead of taking the actual number of images into account, that are not being displayed.

    Example from the demo site: grafik

    After resizing the browser window, some pictures disappeared from the grid view, but the counter icon stays the same: grafik

    Expected behavior The counter updates dynamically to always display the number of images not appearing in the grid view.

    Your environment: https://photos.qpqp.dk/photos, running version 2.3.6 (4af3d11d)

    Additional context Add any other context about the problem here.

    bug 
    opened by ch-koehler 3
  • [FR] - optional setting to show image titles in UI

    [FR] - optional setting to show image titles in UI

    Hi. Apologize if this feature exists, but my use-case involves needing to see the titles of the images I'm looking at, and it is a little cumbersome to have to click into each individual image. Thanks!

    feature 
    opened by HITChris 0
  • Scan progress bar

    Scan progress bar

    Hi

    On the bottom right, they are some information about the scanning process (sometimes there are not)... They can be useful but I am missing an overall progress status. For example an increasing photo counter /bar: 456 / 43 257 photos

    So we know clearly and easily where the scan process is

    opened by darrepac 1
  • Thumbnails are full-width on mobile -> Album-grids become lists -> Finding photos is slow

    Thumbnails are full-width on mobile -> Album-grids become lists -> Finding photos is slow

    Is your feature request related to a problem? Please describe. I'd like to use photoview on mobile to view and find non-locally stored photos like i can locally stored photos using the google photos app.

    The problem with that is, that i can only see about 3 photos at once, because most of them are 16:9 and therefore full width. In Google Photos i can pinch to zoom to switch between 2-, 4- and 5-column layouts.

    Seeing more photos at once makes it much faster to find specific photos. See this comparison: | PhotoView | Google Photos App | | --- | --- | | Screenshot_20210910-220151 | Screenshot_20210910-215947 |

    Describe the solution you'd like Decrease max thumbnail width on mobile or allow configuring a fixed column count on the current device

    Describe alternatives you've considered I can't think of any alternatives

    Additional context A fix would probably need to be implemented somewhere here: https://github.com/photoview/photoview/blob/bb613345eea2b39af546cbcd04fe9f077856b667/ui/src/components/photoGallery/MediaThumbnail.tsx#L179-L196

    opened by heikomat 0
  • Places enhancement ideas.

    Places enhancement ideas.

    1. a way to open the photo details/download options from the lightbox (or a link to the photo in a place that is available)

    2. a way to switch between lighbox scroller and a list of images to scroll through in for selection -- for example open the results in an album style view

    opened by n8herring 1
  • Info menu show up when closing a photo preview

    Info menu show up when closing a photo preview

    Describe the bug Info menu show up when closing a photo preview

    To Reproduce Steps to reproduce the behavior:

    1. Open a photo
    2. Click on the cross to close the preview
    3. It open the info tab

    Expected behavior It close the preview and we can browse

    Screenshots

    • Are you using Docker? yes
    • Database mariadb 10.5
    • Browser brave
    bug 
    opened by Clemv95 0
  • PostgreSQL ERROR: invalid input syntax for type bigint:

    PostgreSQL ERROR: invalid input syntax for type bigint: "" (SQLSTATE 22P02)

    Describe the bug Migration fails while setting up an empty database

    2021/09/02 14:18:18 /home/deric/go/pkg/mod/gorm.io/driver/[email protected]/migrator.go:294
    [18.161ms] [rows:-] SELECT column_name, is_nullable, udt_name, character_maximum_length, numeric_precision, numeric_precision_radix, numeric_scale, datetime_precision FROM information_schema.columns WHERE table_catalog = 'photoview' AND table_schema = CURRENT_SCHEMA() AND table_name = 'media_exif'
    2021/09/02 14:18:18 Migrating `media_exif.flash` from string to int
    
    2021/09/02 14:18:18 /home/deric/dev/photoview/api/database/migration_exif.go:121 ERROR: invalid input syntax for type bigint: "" (SQLSTATE 22P02)
    [0.459ms] [rows:0] UPDATE media_exif SET flash = NULL WHERE flash = ''
    2021/09/02 14:18:18 Failed to run exif fields migration: migrating `media_exif.flash` failed: convert flash attribute empty values to NULL: ERROR: invalid input syntax for type bigint: "" (SQLSTATE 22P02)
    

    To Reproduce Steps to reproduce the behavior:

    1. create DB: createdb -p 5434 -O $(whoami) -E UTF8 photoview
    2. Switch to postgres driver in api/.env (assuming ident authentication from localhost configured in pg_hba.conf)
    PHOTOVIEW_DATABASE_DRIVER=postgres
    PHOTOVIEW_POSTGRES_URL="postgres:///photoview"
    
    1. start server

    Expected behavior Not to see an error

    • Are you using Docker? no
    • Database postgresql 12
    bug 
    opened by deric 3
  • Memories feature (look back at same day, x years ago)

    Memories feature (look back at same day, x years ago)

    It would be great to have a "Memory section" where there are linked photos of "1 year ago, this day", 2 years ago etc Just a cool feature, It could differentiate Photoview a lot from the others self-hosted photos galleries, since none of them have this functionality.

    I'm not sure how difficult it is to do it, also considering an appeal graphics, but I'm just saying it

    feature 
    opened by Loenus 1
Releases(v2.3.6)
  • v2.3.6(Aug 31, 2021)

    Added

    • #488 Add environment variables to disable optional features Face recognition, video encoding and RAW processing can now be disabled with environment variables

    Improved

    • #388 Improve performance when querying the database to determine if the user owns a requested album

    Fixed

    • #477 Correctly display counterpart JPEGs for RAWs (@tgrondier)
    • #415 Fix small bug when creating a user without specifying a path
    • #452 Fix release version showing undefined under Settings
    • #483 Fix bug where the periodic scanner could not be updated from the UI
    • Make asending the default sort direction, this fixes albums being displayed in reverse alphabetical order
    • d92747c Fix bug where only the first 200 images of a shared album would load
    • #324 Fix lazy-loading of thumbnails when native lazy-loading is not supported by the browser. This caused thumbnails to not load in Safari on iOS

    Translations

    • #457 Add translation for Traditional Chinese (@wswongat)
    • #471 Add translation for Simplified Chinese (@seanzhang98)
    • #470 Add translation for Portuguese (@BrnPer)
    • #487 Add missing translation strings for the France translation (@Zazou49)
    Source code(tar.gz)
    Source code(zip)
  • v2.3.5(Jul 22, 2021)

    Added

    • #382 The UI has been redesigned
      • Custom components are usedSemanticUI is no longer used.
      • Sidebar can now be pinned/unpinned
    • #427 Add support for .mkv videos (@hupfdule)
    • #432 Follow symlinked directories (@hupfdule)
    • #412 Add russian translation (@andreimk)

    Improved

    • #386 Improved italian translation (@Damix48)
    • #389 #443 Update go-face

    Screen Shot 2021-07-22 at 17 42 47

    Source code(tar.gz)
    Source code(zip)
  • v2.3.4(May 27, 2021)

    Fixes

    • Fixes a bug caused by changes to the build process that caused the necessary CSS styles for mapbox to not load, making the Places page unusable.
    • #380 Make sidemenu text smaller and add horizontal padding to prevent translated texts from overflowing.
    Source code(tar.gz)
    Source code(zip)
  • v2.3.3(May 20, 2021)

    Added

    • When a thumbnail is clicked it will now enter presentation mode instead of opening the media in the sidebar. To open the media in the sidebar an info button has been added when hovering over a thumbnail.

    Improved

    • #307 make shared albums sortable
    • #365 add guide for Samba and CIFS support to docker-compose.example.yml (@muCruiser)
    • The internals of gallery navigation has been rewritten to improve stability and correctness.
    • Dependencies has been updated
    • Improved Italian translation (@Damix48 + @auanasgheps)

    Fixed

    • #308 exiftool jobs are now batched and processed by a single runner, this improves performance and prevents unwanted zombie processes.
    • #337 add check to prevent deletion of sole admin user
    • #373 ignore exif fields with Infinite values (@Dhole)
    Source code(tar.gz)
    Source code(zip)
  • v2.3.2(Apr 27, 2021)

    Added

    • #329 French translation improved (@Zazou89)
    • #330 German translation added (@robin-moser)
    • #336 Add version build info in the Settings page

    Fixes

    • #344 Fix a bug that was introduced in previous release, that caused the face recognition to not analyze newly scanned images.

    Improvements

    • #339 #341 #345 Incorporate integration tests for server code to help improve stability in the long run
    Source code(tar.gz)
    Source code(zip)
  • v2.3.1(Apr 19, 2021)

    Added

    • #297 Add localization support and add Settings page for non-admins
    • Add translations for the following languages:
      • Danish
      • French (@hartraft + @Zazou89)
      • Swedish (@roupenig)
      • Italian (@Damix48)
      • Spanish (@danielsb
      • Polish (@sysoppl)

    Improvements

    • Most of the UI has been migrated to Typescript to make future development easier and hopefully make the UI more stable.
    • The Log out button has been moved to the Settings page
    Source code(tar.gz)
    Source code(zip)
  • v2.3.0(Apr 4, 2021)

    Added

    • #258 Use exiftool if installed, to extract more accurate EXIF information (@Kjeldgaard)
    • #271 Add support for .heic images using libheif
    • #275 react-lazyload replaced with custom IntersectionObserver (@stz184)

    Fixed

    • #265 Fix share media not working with postgres
    • #276 Fix bug causing sidecar files to be reprocessed with each scan

    Improvements

    • Go and NPM Dependencies have been updated
    • Dockerfile has been refactored
    • Github CI builds have been improved
    Source code(tar.gz)
    Source code(zip)
  • v2.2.1(Mar 17, 2021)

    Added

    • #221 Support media files in .photoviewignore files that was introduced in the previous release. (@Kjeldgaard)

    Fixed

    • #238 Fix bug where downloading didn't work after the PHOTOVIEW_PUBLIC_URL was removed.
    • #241 Fix compatibility errors with Postgres and face recognition introduced in the previous release.
    • #214 Fix bug where faces would not be processed properly and returned the error: thumbnail url is missing
    Source code(tar.gz)
    Source code(zip)
  • v2.2.0(Mar 4, 2021)

    Added

    • #197 Added face recognition, when an image is scanned the first time, it looks for faces in that image, and automatically tries groups them. A new People page has been added to the side bar. NOTE: that existing images will not be scanned for faces, in order to detect faces in an existing library it's necessary to delete the images completely from Photoview and add rescan them from scratch. This can be done by removing all paths from the Settings page and add them again.
    • #32 #213 Add support for .photoviewignore files, that can be used to specify patterns for directories to ignore when scanning. (@Kjeldgaard)
    • b66cbf9 Add new environment variable PHOTOVIEW_UI_PATH that can be used to specify where the static UI files are located when PHOTOVIEW_SERVE_UI=1. This defaults to ./ui.
    • Add favicon to web UI

    Improvements

    • #218 Completely remove the PHOTOVIEW_PUBLIC_ENDPOINT environment variable.
    • #205 Update Darktable to the latest version (version 3.4.1). This will add support for newer RAW formats, such as Fuji's .arf format.
    • 43f89d1 Improved parsing of the PHOTOVIEW_MYSQL_URL to properly parse passwords with special characters.
    • Replace UI build tool Parcel with Esbuild to improve build times and filesize of the UI

    Fixes

    • #229 #143 Fixes a bug where shared albums didn't work after introducing pagination in v2.1.0. This also solves an old bug where shared albums wasn't queried recursively which ment that only a depth of 3 sub albums could be accessed from an album share.
    Source code(tar.gz)
    Source code(zip)
  • v2.1.1(Feb 15, 2021)

    Fixed

    • #194 Fix database errors related to the new Timeline view for Postgres and Sqlite
    • dfc8912 Fix bug where an unauthorized request would crash the server
    • #195 Improve pagination cache merge
    • #196 Fix bug causing the server to crash when scanning a an image with EXIF data that does not contain date shot information.

    Improvements

    • 13f293e Re-encode video thumbnails if missing from cache
    Source code(tar.gz)
    Source code(zip)
  • v2.1.0(Feb 13, 2021)

    Added

    • #188 Replace "Photos" page with a timeline view
    • #193 Add scroll pagination such that when very large albums are visited, only the first 200 photos are loaded initially and more gets loaded when the user scrolls to the bottom of the page. The new timeline view is also paginated

    Improvements

    • #190 Add dataloaders to combine repeated database queries, this should greatly reduce the stress on the database and improve performance.

    Fixed

    • 54a83a4 Fix bug causing web UI to render a blank page if a photo that was in the middle of being scanned was loaded.
    • 2ba8e46 Update media date_shot attribute to match EXIF data
    Source code(tar.gz)
    Source code(zip)
  • v2.0.1(Feb 1, 2021)

    Added

    • #180 Add support for Postgres databases (@andrasmaroy)

    Fixed

    • #179 Fix problems with Docker builds for ARM introduced in previous release
    • #149 Fix thumbnail lazy-loading problem for album shares
    Source code(tar.gz)
    Source code(zip)
  • v2.0.0(Jan 31, 2021)

    Migration notice: The database structure has been completely rewritten, this means that it is not possible to migrate from earlier versions without deleting the old database first. Most environment variables has also been renamed. Check out the new docker-compose.example.yml, if you are using Docker.

    Added

    • #130 Complete database rewrite adding support for multiple database backends such as Sqlite
    • #67 #157 Support multiple root directories for the same user as well as overlapping and shared paths among multiple users.
    • #131 #169 #173 The scanner will now skip transcoding videos that can be played natively in the browser

    Improvements

    • Environment variables has been renamed to start with PHOTOVIEW_ to clearify and avoid potential collisions.
    Source code(tar.gz)
    Source code(zip)
  • v1.1.4(Dec 27, 2020)

    Added

    • #148 Photo duplication detection (@stz184) If the scanner detects a RAW and a JPEG image with the same name then the scanner will use the JPEG directly instead of generating one from the RAW image.

    Fixed

    • 4980a77 Fix bug that caused settings page to render a blank screen in Safari

    Improvements

    • Dependencies has been updated
    Source code(tar.gz)
    Source code(zip)
  • v1.1.3(Nov 28, 2020)

    Added

    • #135 Update JPEGs on sidecar file change (@seam345)

    Fixed

    • d7ed03c Fixes a bug where passwords couldn't be added to shares
    • c7ee506 Fixes a bug where some images couldn't be downloaded from the sidebar

    Improvements

    • #112 All React components has been migrated to to functional components (@stz184)
    Source code(tar.gz)
    Source code(zip)
  • v1.1.2(Nov 13, 2020)

    Added

    • #99 Options for sorting media by, date shot, date imported, title and kind
    • 940e48f Add support for http compression for the API

    Fixed

    • 1386c8d Fix error messages when visiting share without being logged in

    Improvements

    • A lot of general refactoring
    • #110 Setup UI unit testing with jest
    • Dependencies has been updated
    Source code(tar.gz)
    Source code(zip)
  • v1.1.1(Sep 30, 2020)

    Added

    • #90 Added "Places" to the sidebar, which when clicked will show a map with all geo-tagged photos. To enable this feature a mapbox token is needed, make sure to set it as the environment variable MAPBOX_TOKEN. See the updated docker-compose.example.yml, for a docker configuration
    • #76 Toggle switch has been added, to the Photos and Album pages, to show only favorited media. (thanks to @stz184)
    • 4fe0608 Add cache header for photo resources

    Fixed

    • General refactoring for UI files
    Source code(tar.gz)
    Source code(zip)
  • v1.1.0(Sep 25, 2020)

    Added

    • #79 Periodic scanner: the scanner can be set to run periodically at a fixed time-interval that can be configured from the settings page
    • #80 Change max concurrent workers: an option has been added to the settings page to change the max amount of jobs the scanner can run at once. Was previously fixed to 3.

    Fixed

    • #88 Fix a configuration error causing ARM builds to not be compiled properly
    • a257dfb Fix layout problems with narrow images
    • 467ec54 Fix bug where reloading the initial setup page would cause an exception, rendering the page white.
    • Update go and npm dependencies
    Source code(tar.gz)
    Source code(zip)
  • v1.0.1(Aug 18, 2020)

    Added

    • #7 Improvements to the web ui on mobiles
      • Move the side menu to the bottom of the screen on smaller screens.
      • Right sidebar will only show up on mobile when an image is selected, afterwards it can be dismissed again.

    Fixed

    • Fix various layout issues on smaller screens
    • Hide blue outline from buttons in presentation view
    Source code(tar.gz)
    Source code(zip)
  • v1.0.0(Aug 15, 2020)

    This marks the first stable release for Photoview.

    • This introduces a proper release versioning for the docker images.

    • All database migrations have been merged with this release, to simplify development and improve compatibility and stability in the future. But this also means that it will not be possible to upgrade from previous versions without wiping the database.

    • The viktorstrate/photoview:latest docker image will from now on reflect the latest stable release to improve stability.

    • Photoview now supports ARM based systems, though only arm64 supports RAW photos and videos, as these features depend on external software.

    Source code(tar.gz)
    Source code(zip)
Owner
Photoview
Photo gallery for self-hosted personal servers
Photoview
An easy to use, simple to manage, web photo gallery written in PHP.

UberGallery - The simple PHP photo gallery Created by, Chris Kankiewicz Introduction UberGallery is an easy to use, simple to manage, web photo galler

UberGallery 195 Aug 16, 2021
CSS only Gallery

Gallery.css Gallery.css is all CSS. Think: Simple, maintainable and understandable galleries without the use of Javascript. What? No script!? Why? — G

Ben Schwarz 1.1k Sep 15, 2021
Source Code

/** * Coppermine Photo Gallery * * v1.0 originally written by Gregory Demar * * @copyright Copyright (c) 2003-2020 Coppermine Dev Team * @licen

Coppermine Photo Gallery 48 Aug 19, 2021
A directory-first photo gallery website, witch rich UI, optimised for running on low resource servers (especially on raspberry pi)

PiGallery2 Homepage: http://bpatrik.github.io/pigallery2/ This is a directory-first photo gallery website, optimised for running on low resource serve

Patrik J. Braun 650 Sep 23, 2021
A static photo gallery generator

Fussel Fussel is a static photo gallery generator. It can build a simple static photo gallery site with nothing but a directory full of photos. Featur

Chris Benninger 84 Aug 18, 2021
Photato - The personal Pictures gallery

Photato Photato aims to be a self-hosted photo gallery, accessible through a responsive WebUI. Give to Photato a picture folder and it will index it,

Trebonius 137 Sep 17, 2021
KDE GitHub Mirror 377 Sep 14, 2021
Manage your photos with Piwigo, a full featured open source photo gallery application for the web. Star us on Github! More than 200 plugins and themes available. Join us and contribute!

Manage your photo library. Piwigo is open source photo gallery software for the web. Designed for organisations, teams and individuals. The piwigo.org

Piwigo 1.5k Sep 15, 2021
A great looking and easy-to-use photo-management-system you can run on your server, to manage and share photos.

A great looking and easy-to-use photo-management-system. Since the 1st of April 2018 this project has moved to its own Organisation (https://github.co

Lychee Organisation 1.2k Sep 24, 2021
yet another simple static gallery generator

Sigal - Simple Static Gallery Generator Sigal is yet another simple static gallery generator. It's written in Python and it allows to build a static g

Simon Conseil 713 Sep 8, 2021
Open Source image hosting software.

Chevereto-Free ?? Subscribe to the newsletter to don't miss any update regarding Chevereto. Chevereto-Free is an image hosting software that allows yo

Chevereto 2.1k Sep 25, 2021
Personal Photo Management powered by Go and Google TensorFlow

PhotoPrism: Browse Your Life in Pictures PhotoPrism® is a privately hosted app for browsing, organizing, and sharing your photo collection. It makes u

PhotoPrism 16.3k Sep 15, 2021
Dynamic image server for web and print

Quru Image Server - dynamic imaging for web and print QIS is a high performance web server for creating and delivering dynamic images. It is ideal for

Quru 60 Sep 6, 2021
The Zenphoto open-source gallery and CMS project

Zenphoto The simpler media website CMS http://www.zenphoto.org Welcome to the Zenphoto git repository! About Zenphoto is a standalone CMS for multimed

ZenphotoCMS 249 Sep 18, 2021
claiming to be the best image viewer / photo collection browser

################################################################### ## Geeqie x.x ## ##

null 265 Sep 22, 2021
Open source google photos alternative!

ImageStore ImageStore is a self-hosted photo gallery, that makes Google Photos users feel right at home. Features: Clean and intuitive UI for desktop

null 502 Sep 15, 2021
Cross-platform desktop GUI app to clean image metadata

ExifCleaner Desktop app to clean metadata from images, videos, PDFs, and other files. Benefits Fast Drag & Drop Free and open source (MIT) Windows, Ma

null 467 Sep 14, 2021
Self hosted alternative to Google Photos

LibrePhotos Mockup designed by rawpixel.com / Freepik Screenshots Live demo Live demo available here. User is demo, password is demo1234. Communicatio

LibrePhotos 3.2k Sep 17, 2021