### Start PiGallery2 Application Source: https://bpatrik.github.io/pigallery2/setup/direct-install Starts the PiGallery2 application. Default credentials are 'admin'/'admin'. ```bash npm start ``` -------------------------------- ### Install Docker Source: https://bpatrik.github.io/pigallery2/setup/docker Installs Docker on a Raspberry Pi using a curl script. ```bash curl -sSL https://get.docker.com | sh ``` -------------------------------- ### Install PiGallery2 from Source Source: https://bpatrik.github.io/pigallery2/setup/direct-install Downloads the master branch zip, extracts it, navigates to the directory, installs dependencies, and builds the project. Requires approximately 2GB of memory for building. ```bash wget https://github.com/bpatrik/pigallery2/archive/master.zip unzip master.zip cd pigallery2-master npm install npm run build ``` -------------------------------- ### Install PiGallery2 from Release Source: https://bpatrik.github.io/pigallery2/setup/direct-install Downloads the latest release zip, extracts it, navigates to the directory, and installs dependencies using npm. ```bash wget https://github.com/bpatrik/pigallery2/releases/download/3.0.0/pigallery2-release.zip unzip pigallery2-release.zip -d pigallery2 cd pigallery2 npm install ``` -------------------------------- ### Minimal Extension Setup Source: https://bpatrik.github.io/pigallery2/development/extensions A minimal extension requires a server.js file with an init function. ```javascript export const init = (ext) => {}; ``` -------------------------------- ### Install Docker Compose Source: https://bpatrik.github.io/pigallery2/setup/docker Installs Docker Compose using pip3. ```bash sudo pip3 install docker-compose ``` -------------------------------- ### Install Dependencies Source: https://bpatrik.github.io/pigallery2/development/contributing Installs project dependencies using npm. This is a required step before building the client or backend. ```bash npm install ``` -------------------------------- ### Install Node.js from NodeSource Source: https://bpatrik.github.io/pigallery2/setup/direct-install Adds the NodeSource repository for Node.js version 22.x and installs Node.js. ```bash curl -sL https://deb.nodesource.com/setup_22.x | sudo -E bash - sudo apt-get install -y nodejs ``` -------------------------------- ### Run Server Source: https://bpatrik.github.io/pigallery2/development/contributing Starts the PiGallery2 server. This command should be run after the backend has been built. ```bash npm start ``` -------------------------------- ### Install Build Tools Source: https://bpatrik.github.io/pigallery2/setup/direct-install Installs necessary build tools for compiling native modules required by PiGallery2. ```bash sudo apt-get install build-essential libkrb5-dev gcc g++ ``` -------------------------------- ### Start MariaDB Test Container Source: https://bpatrik.github.io/pigallery2/development/contributing Start a Docker container for MariaDB with the necessary test settings. This is required for running MySQL/MariaDB specific tests. ```bash docker run --name pigallery_test -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=pigallery_test -e MYSQL_USER=user -e MYSQL_PASSWORD=password -p3306:3306 -d mariadb:10.3 --log-bin --binlog-format=MIXED ``` -------------------------------- ### Create Configuration Directories Source: https://bpatrik.github.io/pigallery2/setup/advanced/advanced-docker-npm-portainer Create necessary directories for Nginx Proxy Manager and PiGallery2 configurations to maintain a centralized setup for easy backups. ```bash mkdir -p ~/configs/nginx-proxy-manager/data mkdir -p ~/configs/nginx-proxy-manager/letsencrypt mkdir -p ~/configs/pigallery2/config ``` -------------------------------- ### Configure Setting via Environment Variable Source: https://bpatrik.github.io/pigallery2/user-guide/configuration Example of setting a configuration option named 'MyConf' to the value '5' using an environment variable. ```bash SET MyConf=5 ``` -------------------------------- ### Configure Setting via CLI Source: https://bpatrik.github.io/pigallery2/user-guide/configuration Example of setting a configuration option named 'MyConf' to the value '5' using a CLI switch. ```bash --MyConf=5 ``` -------------------------------- ### Deploy Portainer Source: https://bpatrik.github.io/pigallery2/setup/advanced/advanced-docker-npm-portainer Run this Docker command to start the Portainer container, making its management UI accessible at https://:9443. ```bash docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest ``` -------------------------------- ### Run a Specific Test Source: https://bpatrik.github.io/pigallery2/development/contributing Execute a single test file, for example, the SettingsRouter integration tests in the backend. ```bash npx mocha ./test/backend/integration/routers/admin/SettingsRouter.js ``` -------------------------------- ### Photo Directory Structure Example Source: https://bpatrik.github.io/pigallery2/blog/How%20do%20I%20use%20PiGallery2%202021 Illustrates a recommended folder structure for organizing photos, including year and event-based subfolders. This structure helps in managing large photo collections. ```text |-- Family |-- 2000 |-- 2001 |--2002 |--2002.01.01 Event name 1 |--2002.04.01 Event name 2 |--2002.05.01-10 A long event |-- Other |-- 2000 |-- 2000.05.02 Some event name ``` -------------------------------- ### Implementing the init Function Source: https://bpatrik.github.io/pigallery2/development/extensions The required init function for an extension, which receives an IExtensionObject. This is a basic template for starting an extension. ```typescript export const init = async (extension: IExtensionObject): Promise => {}; ``` -------------------------------- ### Set Server URL Base for Subdirectory Access Source: https://bpatrik.github.io/pigallery2/user-guide/configuration Configure this if your gallery is accessed under a subdirectory (e.g., https://mydomain.com/myGallery). Ensure the URL starts with '/'. Defaults to an empty string. ```bash --Server-urlBase ``` -------------------------------- ### Display Help and Configuration Options Source: https://bpatrik.github.io/pigallery2/user-guide/configuration Run this command to display all available meta CLI options, including configuration-related flags. ```bash npm start -- --help ``` -------------------------------- ### Basic Configuration Sample Source: https://bpatrik.github.io/pigallery2/user-guide/configuration A sample of the config.json file showing various settings like image loading behavior, title customization, and theme options. ```json { "//[loadFullImageIfPreviewTooSmall]": "When enabled, the lightbox will load the full resolution image if all available preview thumbnails are too small for the current view.", "loadFullImageIfPreviewTooSmall": true, "//[Titles]": "Set these to customize the text (caption, location, etc.) in the lightbox that are always visible over the photo (not in the info panel).", "Titles": { "topLeftTitle": [ 6 ], "topLeftSubtitle": [ 5 ], "bottomLeftTitle": [ 10, 9 ], "bottomLeftSubtitle": [ 8 ] } }, "//[Themes]": "Pigallery2 uses Bootstrap 5.3 (https://getbootstrap.com/docs/5.3) for design (css, layout). In dark mode it sets 'data-bs-theme=\"dark\"' to the to take advantage bootstrap's color modes. For theming, read more at: https://getbootstrap.com/docs/5.3/customize/color-modes/", "Themes": { "//[enabled]": "Enable themes and color modes.", "enabled": true, "//[defaultMode]": "Sets the default theme mode that is used for the application.", "defaultMode": "auto", "//[selectedTheme]": "Selected theme to use on the site.", "selectedTheme": "classic", "//[availableThemes]": "Adds these CSS settings as it is to the end of the body tag of the page.", "availableThemes": [ { "//[name]": "Name of the theme", "name": "classic", "//[theme]": "Adds these css settings as it is to the end of the body tag of the page.", "theme": ":root nav.navbar { --bs-navbar-color: rgba(255, 255, 255, 0.55); --bs-navbar-hover-color: rgba(255, 255, 255, 0.75); --bs-navbar-disabled-color: rgba(255, 255, 255, 0.25); --bs-navbar-active-color: #fff; --bs-navbar-brand-color: #fff; --bs-navbar-brand-hover-color: #fff; --bs-bg-opacity: 1; background-color: rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important; }" } ] }, "//[InlineBlogStartsOpen]": "Makes inline blog (*.md files content) auto-open.", "InlineBlogStartsOpen": false, "//[TopBlogStartsOpen]": "Makes top blog (*.md files content) auto-open.", "TopBlogStartsOpen": false, "//[AutoUpdate]": "makes the gallery poll the backend for new photos in the given directory or search", "AutoUpdate": { "//[enable]": "Enable auto polling for new photos and videos in the gallery.", "enable": false, "//[interval]": "Frequency of the auto polling in seconds.", "interval": 60 } } ``` -------------------------------- ### Install Docker Dependencies Source: https://bpatrik.github.io/pigallery2/setup/docker Installs necessary dependencies for Docker Compose on Debian-based systems. ```bash sudo apt-get install libffi-dev libssl-dev sudo apt-get install -y python3 python3-pip sudo apt-get remove python-configparser ``` -------------------------------- ### Start Docker Compose Services Source: https://bpatrik.github.io/pigallery2/setup/docker Starts the PiGallery2 services defined in docker-compose.yml in detached mode. ```bash docker-compose up -d ``` -------------------------------- ### Create Config File and Terminate Source: https://bpatrik.github.io/pigallery2/user-guide/configuration Creates the configuration file and then terminates the application. ```bash --config-save-and-exist ``` -------------------------------- ### Sample config.json Source: https://bpatrik.github.io/pigallery2/user-guide/configuration This is a sample configuration file demonstrating various settings for the gallery application. It covers options for caching, rendering, sorting, navigation bar behavior, and lightbox settings. ```json { "//[suppressDefUserWarn]": "if true, the app won't show a warning for using the default user.", "suppressDefUserWarn": false }, "Gallery": { "//[enableCache]": "Caches directory contents and search results for better performance.", "enableCache": true, "//[enableOnScrollRendering]": "Those thumbnails get higher priority that are visible on the screen.", "enableOnScrollRendering": true, "//[enableDirectorySortingByDate]": "If enabled, directories will be sorted by date, like photos, otherwise by name. Directory date is the last modification time of that directory not the creation date of the oldest photo.", "enableDirectorySortingByDate": false, "//[ignoreTimestampOffset]": "If enabled, timestamp offsets are ignored, meaning that the local times of pictures are used for searching, sorting and grouping. If disabled, global time is used and pictures with no timestamp are assumed to be in UTC (offset +00:00).", "ignoreTimestampOffset": true, "//[enableOnScrollThumbnailPrioritising]": "Those thumbnails will be rendered first that are in view.", "enableOnScrollThumbnailPrioritising": true, "NavBar": { "//[enableDownloadZip]": "Enable zipped download of the listed directory or search results.", "enableDownloadZip": true, "//[enableDirectoryFlattening]": "Adds a button to flatten the file structure, by listing the content of all subdirectories. (Won't work if the gallery has multiple folders with the same path.)", "enableDirectoryFlattening": false, "//[defaultGidSize]": "Default grid size that is used to render photos and videos.", "defaultGidSize": "medium", "//[showItemCount]": "Shows the number photos and videos on the navigation bar.", "showItemCount": true, "//[links]": "Visible links in the top menu.", "links": [ { "type": "gallery" }, { "type": "albums" }, { "type": "faces" } ], "//[NavbarShowDelay]": "Ratio of the page height, you need to scroll to show the navigation bar.", "NavbarShowDelay": 0.3, "//[NavbarHideDelay]": "Ratio of the page height, you need to scroll to hide the navigation bar.", "NavbarHideDelay": 0.15, "//[showScrollUpButton]": "Set when the floating scroll-up button should be visible.", "showScrollUpButton": "mobileOnly", "SortingGrouping": { "//[defaultPhotoSortingMethod]": "Default sorting method for photo and video in a directory results.", "defaultPhotoSortingMethod": { "method": "Date", "ascending": true }, "//[defaultSearchSortingMethod]": "Default sorting method for photo and video in a search results.", "defaultSearchSortingMethod": { "method": "Date", "ascending": false }, "//[defaultPhotoGroupingMethod]": "Default grouping method for photo and video in a directory results.", "defaultPhotoGroupingMethod": { "method": "Date", "ascending": true }, "//[defaultSearchGroupingMethod]": "Default grouping method for photo and video in a search results.", "defaultSearchGroupingMethod": { "method": "Date", "ascending": false } } }, "//[captionFirstNaming]": "Show the caption (IPTC 120) tags from the EXIF data instead of the filenames.", "captionFirstNaming": false, "//[Lightbox]": "Photo and video preview window.", "Lightbox": { "//[slideshowSpeed]": "Default time interval for displaying a photo in the slide show.", "slideshowSpeed": 5, "//[captionAlwaysOn]": "If enabled, lightbox will always show caption by default, not only on hover.", "captionAlwaysOn": false, "//[facesAlwaysOn]": "If enabled, lightbox will always show faces by default, not only on hover.", "facesAlwaysOn": false, "//[loopVideos]": "If enabled, lightbox will loop videos by default.", "loopVideos": false, "//[loopSlideshow]": "If enabled, lightbox will start from the first photo when it reached the last one.", "loopSlideshow": false, "//[loadFullImageOnZoom]": "Enables loading the full resolution image on zoom in the lightbox (preview).", "loadFullImageOnZoom": true } } } ``` -------------------------------- ### Create Configuration Directory Source: https://bpatrik.github.io/pigallery2/blog/%5BTutorial%5D%20Pigallery2%20From%20Zero%20To%20Hero%202025 Create a central directory to store all service configuration files for easy backup. ```bash cd ~ mkdir config ``` -------------------------------- ### Map Path Configuration Sample Source: https://bpatrik.github.io/pigallery2/user-guide/configuration Sample JSON snippet demonstrating configuration for map paths, including styling like dash patterns and SVG icons for markers. ```json { "//[dashArray]": "Dash pattern of the path. Represents the spacing and length of the hash. Read more about dash array at: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-dasharray.", "dashArray": "", "//[svgIcon]": "Set the icon of the map marker pin.", "svgIcon": { "//[viewBox]": "SVG path viewBox. See: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/viewBox", "viewBox": "0 0 512 512", "//[items]": "Content elements (paths, circles, rects) of the SVG icon. Icons used on the map: fontawesome.com/icons.", "items": "" } } ``` -------------------------------- ### Run PiGallery2 with Port Override Source: https://bpatrik.github.io/pigallery2/setup/direct-install Starts the PiGallery2 application and overrides the default server port to 8080 using a command-line switch. ```bash npm start -- --Server-port=8080 ``` -------------------------------- ### Portainer Docker Compose Configuration Source: https://bpatrik.github.io/pigallery2/blog/%5BTutorial%5D%20Pigallery2%20From%20Zero%20To%20Hero%202025 Defines the Docker Compose setup for running the Portainer CE container. Ensure the 'portainer_data' volume is external. ```yaml version: "3.9" services: homer: image: portainer/portainer-ce:lts container_name: portainer volumes: - /var/run/docker.sock:/var/run/docker.sock - portainer_data:/data ports: - 9443:9443 restart: always volumes: portainer_data: external: true ``` -------------------------------- ### Recommended Extension Folder Structure Source: https://bpatrik.github.io/pigallery2/development/extensions This structure shows the optional package.js and the required server.js for an extension. ```text /myextension/package.js <- this is optional. You can add extra npm packages here /myextension/server.js <- this is needed ``` -------------------------------- ### Sample config.json Source: https://bpatrik.github.io/pigallery2/user-guide/configuration A sample configuration file for Pigallery2, illustrating various settings. This file defines server parameters, user authentication, logging levels, and OIDC integration. ```json { "reloadClientOnServerUpdate": true, "sessionSecret": [], "sessionTimeout": 604800000, "trustProxy": "false", "port": 80, "host": "0.0.0.0", "Log": { "level": "info", "sqlLevel": "error", "logServerTiming": false } } ``` ```json { "authenticationRequired": true, "unAuthenticatedUserRole": "Admin", "oidc": { "enabled": false, "displayName": "", "issuerUrl": "", "clientId": "", "clientSecret": "", "redirectUri": "", "scopes": [ "openid", "profile", "email" ], "usernameClaim": "preferred_username", "emailClaim": "email", "allowedDomains": [], "autoCreateUser": false }, "enforcedUsers": [], "allowQuery": { "type": 100, "value": "" }, "blockQuery": { "type": 100, "value": "" } } ``` -------------------------------- ### Map Path Bending Configuration Source: https://bpatrik.github.io/pigallery2/user-guide/configuration Configuration to enable bending of long paths on the map. This is useful for visualizing flight paths when only start and end points are provided. ```json "//[bendLongPathsTrigger]": "Map will bend the path if two points are this far apart on latitude axes. This intended to bend flight if only the end and the start points are given.", "bendLongPathsTrigger": 0.5 ``` -------------------------------- ### Create Config File if Not Existent Source: https://bpatrik.github.io/pigallery2/user-guide/configuration This option ensures that a configuration file is created if one does not already exist. ```bash --config-save-if-not-exist ``` -------------------------------- ### Sample config.json Structure Source: https://bpatrik.github.io/pigallery2/user-guide/configuration This snippet shows a sample structure of the config.json file, illustrating various configuration options available for PiGallery2. ```json "supportedFormats": [ "gpx", "pg2conf", "md" ] }, "Album": { "enabled": true, "//[readAccessMinRole]": "Required minimum right to show the albums tab.", "readAccessMinRole": "User" }, "Search": { "//[enabled]": "Enables searching.", "enabled": true, "//[searchCacheTimeout]": "Search cache timeout.", "searchCacheTimeout": 3600000, "AutoComplete": { "//[enabled]": "Show hints while typing search query.", "enabled": true, "//[ItemsPerCategory]": "Maximum number autocomplete items shown per category.", "ItemsPerCategory": { "//[maxItems]": "Maximum number autocomplete items shown at once. If there is not enough items to reach this value, it takes up to double of the individual items.", "maxItems": 20, "//[fileName]": "Maximum number autocomplete items shown per photo category.", "fileName": 2, "//[directory]": "Maximum number autocomplete items shown per directory category.", "directory": 2, "//[caption]": "Maximum number autocomplete items shown per caption category.", "caption": 3, "//[position]": "Maximum number autocomplete items shown per position category.", "position": 3, "//[person]": "Maximum number autocomplete items shown per faces category.", "person": 5, "//[keyword]": "Maximum number autocomplete items shown per keyword category.", "keyword": 5 }, "//[cacheTimeout]": "Autocomplete cache timeout. ", "cacheTimeout": 3600000 }, "//[maxMediaResult]": "Maximum number of photos and videos that are listed in one search result.", "maxMediaResult": 10000, "//[maxDirectoryResult]": "Maximum number of directories that are listed in one search result.", "maxDirectoryResult": 200, "//[listDirectories]": "Search returns also with directories, not just media.", "listDirectories": false, "//[listMetafiles]": "Search also returns with metafiles from directories that contain a media file of the matched search result.", "listMetafiles": true }, "Sharing": { "//[enabled]": "Enables sharing.", "enabled": true, "//[passwordRequired]": "Requires password protected sharing links.", "passwordRequired": false, "//[sharingKeyLength]": "The longer the keys are, the harder they are to guess. Changing this number won't invalidate existing sharing.", "sharingKeyLength": 8, "//[updateTimeout]": "After creating a sharing link, it can be updated for this long.", "updateTimeout": 300000 }, "Map": { "enabled": true, "//[useImageMarkers]": "Map will use thumbnail images as markers instead of the default pin.", "useImageMarkers": true, "mapProvider": "OpenStreetMap", "//[mapboxAccessToken]": "MapBox needs an access token to work, create one at https://www.mapbox.com.", "mapboxAccessToken": "", "//[customLayers]": "The map module will use these urls to fetch the map tiles.", "customLayers": [ { "//[name]": "Name of a map layer.", "name": "street", "//[url]': "Url of a map layer.", "url": "", "//[darkLayer]": "Sets if the layer is dark (used as default in the dark mode).", "darkLayer": false } ], "//[maxPreviewMarkers]": "Maximum number of markers to be shown on the map preview on the gallery page.", "maxPreviewMarkers": 50, "//[MapPathGroupConfig]": "Markers are grouped and themed by these settings", "MapPathGroupConfig": [ { "//[name]": "Name of the marker and path group on the map.", "name": "Transportation", "//[matchers]": "Matchers for a given map and path theme.", "matchers": [ { "//[matchers]": "List of regex string to match the name of the path. Case insensitive. Empty list matches everything.", "matchers": [ "flight", "flying" ], "//[theme]": "List of regex string to match the name of the path.", "theme": { "//[color]": "Color of the path. Use any valid css colors.", "color": "var(--bs-orange)" } } ] } ] } } ``` -------------------------------- ### Sample config.json Structure Source: https://bpatrik.github.io/pigallery2/user-guide/configuration This snippet shows a sample structure of the config.json file, including settings for SMTP and job configurations. It details parameters like SMTP user/password and job-related settings such as maxSavedProgress and mediaProcessingBatchSize. ```json { "//[user]": "User to connect to the SMTP server.", "user": "", "//[password]": "Password to connect to the SMTP server.", "password": "" } "Jobs": { "//[maxSavedProgress]": "Job history size.", "maxSavedProgress": 20, "//[mediaProcessingBatchSize]": "Jobs load this many photos or videos from the DB for processing at once.", "mediaProcessingBatchSize": 1000, "scheduled": [ { "name": "Indexing", "jobName": "Indexing", "config": { "indexChangesOnly": true }, "allowParallelRun": false, "trigger": { "type": "never", "periodicity": 7, "atTime": 0 } }, { "name": "Album Cover Filling", "jobName": "Album Cover Filling", "config": {}, "allowParallelRun": false, "trigger": { "type": "after", "periodicity": 7, "atTime": 0, "afterScheduleName": "Indexing" } }, { "name": "Photo Converting", "jobName": "Photo Converting", "config": { "sizes": [ 320 ], "maxVideoSize": 800, "indexedOnly": true }, "allowParallelRun": false, "trigger": { "type": "after", "periodicity": 7, "atTime": 0, "afterScheduleName": "Album Cover Filling" } }, { "name": "Video Converting", "jobName": "Video Converting", "config": { "indexedOnly": true }, "allowParallelRun": false, "trigger": { "type": "after", "periodicity": 7, "atTime": 0, "afterScheduleName": "Photo Converting" } }, { "name": "GPX Compression", "jobName": "GPX Compression", "config": { "indexedOnly": true }, "allowParallelRun": false, "trigger": { "type": "after", "periodicity": 7, "atTime": 0, "afterScheduleName": "Video Converting" } }, { "name": "Temp Folder Cleaning", "jobName": "Temp Folder Cleaning", "config": { "indexedOnly": true }, "allowParallelRun": false, "trigger": { "type": "after", "periodicity": 7, "atTime": 0, "afterScheduleName": "GPX Compression" } } ] } ``` -------------------------------- ### Build Client Source: https://bpatrik.github.io/pigallery2/development/contributing Builds the client-side application with English localization. This command watches for source file changes and rebuilds automatically. ```bash npm run run-dev ``` -------------------------------- ### Sample config.json Structure Source: https://bpatrik.github.io/pigallery2/user-guide/configuration This JSON snippet shows a sample configuration structure for PiGallery2. It includes comments explaining the purpose of each setting. ```json "//[folder]": "Folder where the app stores all extensions. Individual extensions live in their own sub-folders.", "folder": "extensions", "extensions": {}, "//[cleanUpUnusedTables]": "Automatically removes all tables from the DB that are not used anymore.", "cleanUpUnusedTables": true }, "Upload": { "enabled": false, "//[minimumRole]": "Minimum user role to enable file upload.", "minimumRole": "Admin", "//[enforcedDirectoryConfig]": "Only enable upload in folder where an ".uploader.pg2conf" is present in the folder.", "enforcedDirectoryConfig": false }, "Database": { "//[type]": "SQLite is recommended.", "type": "sqlite", "//[dbFolder]": "All file-based data will be stored here (sqlite database, job history data).", "dbFolder": "db", "sqlite": { "//[DBFileName]": "Sqlite will save the db with this filename.", "DBFileName": "sqlite.db" }, "mysql": { "host": "localhost", "port": 3306, "database": "pigallery2", "username": "", "password": "" } }, "Indexing": { "//[cachedFolderTimeout]": "If there was no indexing in this time, it reindexes. (skipped if indexes are in DB and sensitivity is low).", "cachedFolderTimeout": 3600000, "//[reIndexingSensitivity]": "Set the reindexing sensitivity. High value check the folders for change more often. Setting to never only indexes if never indexed or explicit running the Indexing Job.", "reIndexingSensitivity": "low", "//[excludeFolderList]": "Folders to exclude from indexing. If an entry starts with '/' it is treated as an absolute path. If it doesn't start with '/' but contains a '/', the path is relative to the image directory. If it doesn't contain a '/', any folder with this name will be excluded.", "excludeFolderList": [ ".Trash-1000", ".dtrash", "$RECYCLE.BIN" ], "//[excludeFileList]": "Files that mark a folder to be excluded from indexing. Any folder that contains a file with this name will be excluded from indexing.", "excludeFileList": [], "//[excludeFilenameList]": "Glob patterns to exclude individual media files from indexing. Supports '*' (any characters), '?' (single character) wildcards and ';' to separate multiple patterns. E.g.: '._*' excludes macOS resource fork files starting with '._'; '*.rm' excludes .rm files.", "excludeFilenameList": [] }, "//[AlbumCover]": "Specify a search query and sorting that the app can use to pick the best photo for an album and folder cover. There is no way to manually pick folder and album cover in the app. You can tag some of your photos with 'cover' and set that as search query or rate them to 5 and set sorting to descending by rating.", "AlbumCover": { "//[SearchQuery]": "Filters the sub-folders with this search query. If filter results no photo, the app will search again without the filter.", "SearchQuery": { "type": 100, "value": "" }, "//[Sorting]": "If multiple cover is available sorts them by these methods and selects the first one. Using random sorting does not allow to use any other sorting method.", "Sorting": [ { "method": "Rating", "ascending": false }, { "method": "Date", "ascending": false }, { "method": "PersonCount", "ascending": false } ] }, "Duplicates": { "//[listingLimit]": "Maximum number of duplicates to list.", "listingLimit": 1000 }, "//[Messaging]": "The App can send messages (like photos on the same day a year ago. aka: \"Top Pick\"). Here you can configure the delivery method.", "Messaging": { "//[Email]": "The app uses Nodemailer in the background for sending e-mails. Refer to https://nodemailer.com/usage/ if some options are not clear.", "Email": { "//[emailFrom]": "Some services do not allow sending from random e-mail addresses. Set this accordingly.", "emailFrom": "noreply@pigallery2.com", "smtp": { "//[host]": "SMTP host server", "host": "", "//[port]": "SMTP server's port", "port": 587, "//[secure]": "Is the connection secure. See https://nodemailer.com/smtp/#tls-options for more details", "secure": false, "//[requireTLS]": "if this is true and secure is false then Nodemailer (used library in the background) tries to use STARTTLS. See https://nodemailer.com/smtp/#tls-options for more details", "requireTLS": true } } } } ```