Compare commits

..

1 commit

Author SHA1 Message Date
Michael Mayer
bdc1336116 Upgrade to Vuetify 2.1.10 #132
Signed-off-by: Michael Mayer <michael@liquidbytes.net>
2019-11-17 08:16:51 +01:00
4350 changed files with 39845 additions and 505970 deletions

View file

@ -1,5 +0,0 @@
{
"contributors": "https://api.github.com/repos/photoprism/photoprism/contributors",
"message": "Thank you very much for your contribution! As with many open-source projects, we ask that you sign our contributor license agreement so your pull request can be safely merged.",
"label": "cla-signed"
}

View file

@ -1,22 +1,17 @@
/photos/*
/assets/photos/*
/assets/cache/*
/frontend/node_modules/*
/node_modules
/assets/static/build/*
/assets/facenet
/assets/nasnet
/assets/nsfw
/storage
/build
/assets/resources/database/*
/assets/resources/static/build/*
/assets/resources/nasnet
/assets/testdata
/assets/backups
Dockerfile
/photoprism
/photoprism-*
docker-compose*
/coverage.*
/frontend/tests/acceptance/screenshots
/tmp/
.dockerignore
.idea
.DS_Store
.env
*.db
*.db-journal
Dockerfile
docker-compose*
/frontend/tests/acceptance/screenshots

View file

@ -1,182 +0,0 @@
---
kind: pipeline
type: exec
name: linux-amd64
platform:
arch: amd64
os: linux
trigger:
event:
exclude:
- pull_request
- tag
steps:
- name: up
environment:
DOCKER_USERNAME:
from_secret: docker_username
DOCKER_PASSWORD:
from_secret: docker_password
CODECOV_TOKEN:
from_secret: codecov_token
commands:
- scripts/login.sh
- docker compose -f docker-compose.ci.yml pull
- docker compose -f docker-compose.ci.yml stop
- docker compose -f docker-compose.ci.yml up -d --build --force-recreate
- name: test-develop
environment:
CODECOV_TOKEN:
from_secret: codecov_token
commands:
- docker compose -f docker-compose.ci.yml exec -e CODECOV_TOKEN=$${CODECOV_TOKEN} -T photoprism make all test-js test-codecov install migrate
when:
branch:
- develop
- name: test
commands:
- docker compose -f docker-compose.ci.yml exec -T photoprism make all test install migrate
when:
branch:
- preview
- release
- name: down
commands:
- docker compose -f docker-compose.ci.yml down
when:
status:
- failure
- success
- name: deploy-preview
environment:
DOCKER_USERNAME:
from_secret: docker_username
DOCKER_PASSWORD:
from_secret: docker_password
commands:
- scripts/login.sh
- scripts/install-qemu.sh
- make docker-preview
when:
status:
- success
branch:
- preview
- name: deploy-demo
environment:
DOCKER_USERNAME:
from_secret: docker_username
DOCKER_PASSWORD:
from_secret: docker_password
commands:
- scripts/login.sh
- docker pull photoprism/photoprism:preview
- make docker-demo
when:
status:
- success
branch:
- preview
- name: deploy-release
environment:
DOCKER_USERNAME:
from_secret: docker_username
DOCKER_PASSWORD:
from_secret: docker_password
commands:
- scripts/login.sh
- scripts/install-qemu.sh
- make docker-release
when:
status:
- success
branch:
- release
---
kind: pipeline
type: exec
name: pull-request
platform:
arch: amd64
os: linux
trigger:
event:
include:
- pull_request
steps:
- name: up
commands:
- docker-compose -f docker-compose.ci.yml up -d --build --force-recreate
- name: test
commands:
- docker-compose -f docker-compose.ci.yml exec -T photoprism make all test install migrate
- name: down
commands:
- docker-compose -f docker-compose.ci.yml down
when:
status:
- failure
- success
---
kind: pipeline
type: exec
name: linux-arm64
trigger:
branch:
- preview
event:
exclude:
- pull_request
- tag
platform:
arch: arm64
os: linux
steps:
- name: up
environment:
DOCKER_USERNAME:
from_secret: docker_username
DOCKER_PASSWORD:
from_secret: docker_password
commands:
- scripts/login.sh
- docker-compose -f docker-compose.ci.yml stop
- docker-compose -f docker-compose.ci.yml up -d --build --force-recreate
- name: test
commands:
- docker-compose -f docker-compose.ci.yml exec -T photoprism make all test-go install migrate
- name: down
commands:
- docker-compose -f docker-compose.ci.yml down
- docker system prune -f
when:
status:
- failure
- success
---
kind: signature
hmac: 61a27b3c3142a9a1d1972f0fe00a8aa19d99623e6fea6e1d5ad44b6b20cd5cd1
...

40
.fossa.yml Normal file → Executable file
View file

@ -1,24 +1,18 @@
version: 3
# Generated by FOSSA CLI (https://github.com/fossas/fossa-cli)
# Visit https://fossa.com to learn more
project:
name: "PhotoPrism"
id: "github.com/photoprism/photoprism"
url: "https://github.com/photoprism/photoprism"
link: "https://www.photoprism.app/"
revision:
branch: "develop"
paths:
exclude:
- ./.github
- ./assets
- ./build
- ./docker
- ./frontend/tests
- ./storage
- ./scripts
- ./test
telemetry:
scope: "off"
version: 2
cli:
server: https://app.fossa.com
fetcher: custom
project: git@github.com:photoprism/photoprism.git
analyze:
modules:
- name: github.com/photoprism/photoprism/cmd/photoprism
type: go
target: github.com/photoprism/photoprism/cmd/photoprism
path: cmd/photoprism
- name: frontend
type: npm
target: frontend
path: frontend

View file

@ -1,81 +0,0 @@
---
name: Bug Report
about: Report a new and clearly identified bug that must be fixed directly in the application
title: 'SHORT DESCRIPTION OF THE PROBLEM YOU ARE REPORTING'
labels: bug
assignees: ''
---
PLEASE PROCEED ONLY IF YOU ARE ABSOLUTELY SURE THAT THIS IS NOT A TECHNICAL SUPPORT INCIDENT AND/OR POSSIBLY A PROBLEM WITH SOME OTHER SOFTWARE YOU ARE USING. VISIT <https://www.photoprism.app/kb/getting-support> TO LEARN MORE ABOUT OUR SUPPORT OPTIONS. THANK YOU FOR YOUR CAREFUL CONSIDERATION!
---------------------------------------------------------------------------
#### 1. What is not working as documented?
Please be as specific as possible and explain what part of the software is not [working as documented](https://docs.photoprism.app/). "No photos found" would not be detailed enough. Also, never report [known issues](https://docs.photoprism.app/known-issues/) or [features not yet implemented](https://github.com/photoprism/photoprism/issues) as bugs. Thank you!
#### 2. How can we reproduce it?
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
When reporting an import, indexing, or performance issue, please include the number and type of pictures in your library, as well as any configuration options you have changed, such as for thumbnail quality.
#### 3. What behavior do you expect?
Give us a clear and concise description of what you expect.
#### 4. What could be the cause of your problem?
Always try to determine the cause of your problem using the checklists at <https://docs.photoprism.app/getting-started/troubleshooting/> before submitting a bug report.
#### 5. Can you provide us with example files for testing, error logs, or screenshots?
Please include sample files or screenshots that help to reproduce your problem. You can also email files or share a download link, see <https://www.photoprism.app/contact> for details.
Visit <https://docs.photoprism.app/getting-started/troubleshooting/browsers/> to learn how to diagnose frontend issues.
**Important: If it is an import, indexing or metadata issue, we require sample files and logs from you.** Otherwise, we will not be able to process your report. If it is an import problem specifically, please always provide us with an archive of the files before you imported them so we can reproduce the behavior.
#### 6. Which software versions do you use?
(a) PhotoPrism Architecture & Build Number: AMD64, ARM64, ARMv7,...
(b) Database Type & Version: MariaDB, MySQL, SQLite,...
(c) Operating System Types & Versions: Linux, Windows, Android,...
(d) Browser Types & Versions: Firefox, Chrome, Safari on iPhone,...
(e) Ad Blockers, Browser Plugins, and/or Firewall Software?
You can find the version/build number of the app in *Settings* by scrolling to the bottom. Note that MySQL 8 support has been discontinued, see system requirements at <https://docs.photoprism.app/getting-started/#system-requirements>.
*Always provide database and operating system details if it is a backend, import, or indexing issue. Should it be a frontend issue, at a minimum we require you to provide web browser and operating system details. When reporting a performance problem, we ask that you provide us with complete information about your environment, as there may be more than one cause.*
#### 7. On what kind of device is PhotoPrism installed?
This is especially important if you are reporting a performance, import, or indexing issue. You can skip this if you're reporting a problem you found in our public demo, or if it's a completely unrelated issue, such as incorrect page layout.
(a) Device / Processor Type: Raspberry Pi 4, Intel Core i7-3770, AMD Ryzen 7 3800X,...
(b) Physical Memory & Swap Space in GB
(c) Storage Type: HDD, SSD, RAID, USB, Network Storage,...
(d) Anything else that might be helpful to know?
*Always provide device, memory, and storage details if you have a backend, performance, import, or indexing issue.*
#### 8. Do you use a Reverse Proxy, Firewall, VPN, or CDN?
If yes, please specify type and version. You can skip this if you are reporting a completely unrelated issue.
*Always provide this information when you have a reliability, performance, or frontend problem, such as failed uploads, connection errors, broken thumbnails, or video playback issues.*
**Using NGINX?** Please also provide the configuration and/or consider asking the NGINX community for advice as we do not specialize in supporting their product. Docs can be found at <https://docs.photoprism.app/getting-started/proxies/nginx/>.

View file

@ -1,33 +0,0 @@
---
name: Feature Request
about: Suggest a new feature or enhancement
title: 'Category: Short Description (PLEASE CHANGE)'
labels: idea
assignees: ''
---
PLEASE ONLY PROCEED IF YOU ARE ABSOLUTELY SURE THAT THIS IS NOT A TECHNICAL SUPPORT INCIDENT AND/OR A PROBLEM WITH OTHER SOFTWARE YOU ARE USING. PLEASE ALSO CHECK OUR PUBLIC ROADMAP AND TRY TO FIND EXISTING FEATURE REQUESTS FIRST:
- <https://link.photoprism.app/roadmap>
- <https://github.com/photoprism/photoprism/issues>
VISIT <https://www.photoprism.app/kb/getting-support> TO LEARN MORE ABOUT OUR SUPPORT OPTIONS. THANK YOU FOR YOUR CAREFUL CONSIDERATION!
===============================================================================
**Describe what problem this solves and why this would be valuable to many users**
A clear and concise description of what the problem is and why it is important to solve it.
**Describe the solution you'd like**
A clear and concise description of what you suggest to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

View file

@ -1,18 +0,0 @@
---
name: Question
about: You have a general question or need assistance
title: 'STOP! DO NOT PROCEED, USE GITHUB DISCUSSIONS INSTEAD - THANK YOU'
labels: technical-support
assignees: ''
---
FOR GENERAL QUESTIONS, TECHNICAL SUPPORT, AND TO GET TO KNOW OTHER COMMUNITY MEMBERS:
<https://github.com/photoprism/photoprism/discussions>
OUR TROUBLESHOOTING CHECKLISTS HELP YOU QUICKLY DIAGNOSE AND FIX COMMON PROBLEMS:
<https://docs.photoprism.app/getting-started/troubleshooting/>
DO NOT PROCEED, THANK YOU!

View file

@ -1,33 +0,0 @@
<!--
Thank you for your interest in contributing!
Because we want to create the best possible product for our users, we have a set of criteria to ensure that all submissions are acceptable, see https://docs.photoprism.app/developer-guide/pull-requests/ for details.
(1) Please provide a concise description of your pull request.
- What does it implement / fix / improve? Why?
- Are the changes related to an existing issue?
(2) After you submit your first pull request, you will be asked to accept our CLA, see https://www.photoprism.app/cla.
(3) Finally, please confirm that the following criteria are met by replacing "[ ]" with "[x]" (also possible at a later time).
-->
Acceptance Criteria:
- [ ] Features and enhancements must be fully implemented so that they can be released at any time without additional work
- [ ] Automated unit and/or acceptance tests are mandatory to ensure the changes work as expected and to reduce repetitive manual work
- [ ] Frontend components must be responsive to work and look properly on phones, tablets, and desktop computers; you must have tested them on all major browsers and different devices
- [ ] Documentation and translation updates should be provided if needed
- [ ] In case you submit database-related changes, they must be tested and compatible with SQLite 3 and MariaDB 10.5.12+
<!--
Since reviewing, testing and finally merging pull requests requires significant resources on our side, this can take several months if it's not just a small fix, especially if extensive testing is required to prevent bugs from getting into our stable version.
We thank you for your patience! :)
-->

View file

@ -1,31 +0,0 @@
name: "CodeQL"
on:
push:
branches: [ develop, release, master ]
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: [ 'go', 'javascript' ]
steps:
- name: Checkout repo
uses: actions/checkout@v2
- name: Initialize CodeQL
uses: github/codeql-action/init@v2
with:
languages: ${{ matrix.language }}
- name: CodeQL Analysis
uses: github/codeql-action/analyze@v2

31
.gitignore vendored
View file

@ -1,32 +1,20 @@
# Application files and directories
/photoprism
/photoprism-*
/photos/originals/*
/photos/import/*
/storage/*
/build/*
/assets/photos/originals/*
/assets/photos/import/*
/assets/photos/export/*
/assets/resources/database/*
!/assets/resources/database/.gitignore
/node_modules
/pro
/plus
/frontend/.eslintcache
/frontend/node_modules/*
/frontend/tests/*.html
/frontend/tests/*.log
/frontend/tests/screenshots
/frontend/src/locales/*.mo
/assets/facenet
/assets/nasnet
/assets/nsfw
/assets/static/build/
/package-lock.json
/frontend/tests_output
/tmp/
/assets/testdata
/assets/backups
/assets/resources/nasnet
*.log
*.pid
*.db
*.db-journal
docker-compose.override.yml
docker-compose.tmp.yml
# Binaries for programs and plugins
*.exe
@ -60,7 +48,6 @@ Thumbs.db
.settings
.swp
.tmp
.env
#Karma Coverage Report
frontend/coverage/
frontend/coverage/

169
.ldap.cfg
View file

@ -1,169 +0,0 @@
debug = true
[behaviors]
# Ignore all capabilities restrictions, for instance allowing every user to perform a search
IgnoreCapabilities = true
[ldap]
enabled = true
listen = "0.0.0.0:389"
[ldaps]
enabled = false
listen = "0.0.0.0:636"
[api]
enabled = true
internals = true
tls = false
listen = "0.0.0.0:5555"
[backend]
datastore = "config"
baseDN = "dc=localssl,dc=dev"
[[users]]
name = "user"
givenname = "John"
objectClass = "user"
displayName = "John Doe"
sn = "Doe"
uidnumber = 5003
primarygroup = 5501
loginShell = "/bin/sh"
otherGroups = [5505,5506,5507,5508]
userPrincipalName = "jdoe@example.com"
mail = "jdoe@example.com"
passsha256 = "4314c1fe282face45336b1422a3285c5ff31a39c8e24425615fa53a43b718493" # photoprism
[[users.customattributes]]
photoprismRole = ["user"]
photoprismNoLogin = ["false"]
photoprismWebdav = ["true"]
[[users.capabilities]]
action = "search"
object = "*"
[[users]]
name = "bob"
givenname = "Bob"
objectClass = "user"
displayName = "Robert Jones"
sn = "Jones"
userPrincipalName = "bob@example.com"
mail = "bob@example.com"
uidnumber = 5005
primarygroup = 5502
loginShell = "/bin/bash"
otherGroups = [5505,5506]
passsha256 = "4314c1fe282face45336b1422a3285c5ff31a39c8e24425615fa53a43b718493" # photoprism
[[users.customattributes]]
photoprismRoleUser = ["true"]
photoprismNoLogin = ["false"]
photoprismWebdav = ["true"]
photoprismUploadPath = ["bob"]
[[users.capabilities]]
action = "search"
object = "*"
[[users]]
name = "guest"
objectClass = "user"
givenname = "Guest"
displayName = "Guest User"
userPrincipalName = "guest@example.com"
mail = "guest@example.com"
uidnumber = 5006
primarygroup = 5503
loginShell = "/bin/sh"
otherGroups = [5505,5507]
passsha256 = "4314c1fe282face45336b1422a3285c5ff31a39c8e24425615fa53a43b718493" # photoprism
[[users.customattributes]]
photoprismRole = ["guest"]
[[users.capabilities]]
action = "search"
object = "*"
[[users]]
name = "uploader"
givenname = "Uploader"
objectClass = "user"
displayName = "Uploader"
sn = "Uploader"
userPrincipalName = "uploader@example.com"
mail = "uploader@example.com"
uidnumber = 5007
primarygroup = 5504
loginShell = "/bin/bash"
otherGroups = [5508]
passsha256 = "4314c1fe282face45336b1422a3285c5ff31a39c8e24425615fa53a43b718493" # photoprism
[[users.customattributes]]
photoprismUploadPath = ["bob"]
[[users.capabilities]]
action = "search"
object = "*"
[[users]]
name = "contributor"
givenname = "Contributor"
objectClass = "user"
displayName = "Contributor"
sn = "Contributor"
userPrincipalName = "contributor@example.com"
mail = "contributor@example.com"
uidnumber = 5009
primarygroup = 5509
loginShell = "/bin/bash"
otherGroups = [5508]
passsha256 = "4314c1fe282face45336b1422a3285c5ff31a39c8e24425615fa53a43b718493" # photoprism
[[users.customattributes]]
photoprismUploadPath = ["contrib"]
[[users.capabilities]]
action = "search"
object = "*"
[[users]]
name = "mail"
objectClass = "user"
givenname = "Mail"
displayName = "Mail User"
userPrincipalName = "mail@example.com"
mail = "mail@example.com"
uidnumber = 5507
primarygroup = 5506
loginShell = "/bin/nologin"
otherGroups = [5505]
passsha256 = "4314c1fe282face45336b1422a3285c5ff31a39c8e24425615fa53a43b718493" # photoprism
[[users.capabilities]]
action = "search"
object = "*"
[[groups]]
name = "PhotoPrism-admin"
gidnumber = 5501
[[groups]]
name = "PhotoPrism-user"
gidnumber = 5502
[[groups]]
name = "PhotoPrism-guest"
gidnumber = 5503
[[groups]]
name = "PhotoPrism-uploader"
gidnumber = 5504
[[groups]]
name = "gmail"
gidnumber = 5505
[[groups]]
name = "email"
gidnumber = 5506
[[groups]]
name = "ssh"
gidnumber = 5507
[[groups]]
name = "PhotoPrism-webdav"
gidnumber = 5508
[[groups]]
name = "PhotoPrism-contributor"
gidnumber = 5509

View file

@ -1,5 +0,0 @@
[client]
user=root
password=photoprism
host=mariadb
port=4001

32
.travis.yml Normal file
View file

@ -0,0 +1,32 @@
sudo: required
addons:
apt:
packages:
- docker-ce
cache:
directories:
- $HOME/.cache
before_cache:
- sudo chown -R travis:travis $HOME/.cache
services:
- docker
before_script:
- docker-compose -f docker-compose.travis.yml up -d --build
script:
- scripts/travis.sh
after_script:
- docker-compose -f docker-compose.travis.yml down
deploy:
provider: script
script: make docker-photoprism docker-demo
skip_cleanup: true
on:
branch: master

View file

@ -1,45 +0,0 @@
# PhotoPrism® Code of Conduct
**By using the software and services we provide, you agree to our [Terms of Service](https://www.photoprism.app/terms), including our [Privacy Policy](https://www.photoprism.app/privacy) and the following Code of Conduct. It explains the "dos and donts" when interacting with our team and other community members.**
*Last Updated: July 5, 2023*
## Rules
Because we want our Code of Conduct to be easy to understand and implement, we have only three basic rules, numbered in order of importance:
(1) Be respectful, be responsible, be kind.
(2) Dont panic.
(3) Dont feed the trolls.
## Guidelines
Not everyone has experience with Open Source communities and intuitively knows what is acceptable. In that case, the following guidelines and examples are meant to provide a quick overview and help you avoid the most common pitfalls:
(a) Do not [feel entitled](https://www.reddit.com/r/photoprism/comments/13emwf0/did_you_guys_really_nerf_hardware_transcoding/) to free software, support, or advice, especially if you are not a contributor, [member](https://link.photoprism.app/membership), or business customer. Don't expect contributors to [give status reports](https://docs.photoprism.app/developer-guide/code-quality/#go-slow-before-you-go-fast) as if they work for you or owe you something, even if you have donated a small amount. We also ask that you do not use GitHub Issues or other development tools to start general discussions, get technical support, or express personal opinions.
(b) Honor **Rule &#35;2**, [read the docs](https://docs.photoprism.app) and [determine the cause of your problem](https://docs.photoprism.app/getting-started/troubleshooting/) before opening invalid bug reports, starting a public "shitstorm", or insulting other community members in our chat rooms. Aside from being annoying for everyone, it also keeps our team from working on features and enhancements that users like you are waiting for.
(c) Reckless, [surprisingly harsh](https://github.com/photoprism/photoprism/issues/281#issuecomment-1207233135) or ignorant communication that disregards **Rule &#35;1** is unacceptable, whether public or private. If you are having a bad day and want to offend someone, please go somewhere else.
We have found that many of the issues that new users get upset about when they read about them in community forums or old issue comments have been resolved in the meantime. If not, you can be sure that we are working to improve our software and services to the best of our ability.
*Thanks to our amazing community, problems are rare in practice. Common sense and staying away from the computer when you are tired or hungry should usually be enough to get along with others.*
## Reporting
We encourage all community members to resolve problems on their own whenever possible. Serious and persistent violations, such as disrespectful, abusive, harassing, or otherwise unacceptable behavior, [may be reported](https://www.photoprism.app/contact) to us.
## Enforcement
Our community standards will be enforced as necessary to protect everyone's well-being and to ensure that our discussion forums, chat rooms, and other infrastructure can be used as intended.
Initial warnings may be issued in the form of a [snarky comment](https://www.urbandictionary.com/define.php?term=snarky), especially if your tone is harsh to begin with. In serious cases, we will provide a link to this Code of Conduct to avoid misunderstandings. We also reserve the right to delete rants, personal attacks, spam, and unsolicited advertising from our community forums.
Getting a simple **\*plonk\***[^1] in response finally signals that we have lost hope and you're being ignored according to **Rule &#35;3**. This old tradition from Usenet days is as time-saving as it is clear. It is not meant in a disrespectful way.
In addition, we may use technical measures to temporarily or permanently restrict your access to our infrastructure, including forums and chats.
[^1]: \*plonk\* including variants such as "Plonk." stands for the metaphorical sound of a user hitting the bottom of the kill file. It was first used in [Usenet forums](https://en.everybodywiki.com/Plonk_(Usenet)), a worldwide distributed discussion system and precursor to the Web.

View file

@ -1,78 +1,46 @@
# Every Contribution Makes a Difference
# Every contribution makes a difference
We welcome contributions of any kind, including blog posts, tutorials, testing, writing documentation, and pull requests. Our [Developer Guide](https://docs.photoprism.app/developer-guide/) contains all the information necessary for you to get started.
Think of open-source development as free training with a visible outcome.
Exploring new technologies is easier than in commercial environments,
where development effort is more focused on immediate results.
## Join the Community ##
We welcome contributions of any kind including pull requests, ideas, bug reports,
testing, writing documentation, tutorials and blog posts. If you help with development,
you have the opportunity to learn Docker, Go, TensorFlow and much more.
Follow us on [Twitter](https://link.photoprism.app/twitter) and join the [Community Chat](https://link.photoprism.app/chat)
to get regular updates, connect with other contributors, and discuss your ideas. Our [Code of Conduct](https://www.photoprism.app/code-of-conduct) explains the "dos and donts" when interacting with other community members.
## Questions? ##
Feel free to [contact us](https://www.photoprism.app/contact) with anything that is on your mind. We appreciate your feedback! Due to the high volume of emails we receive, our team may be unable to get back to you immediately. We do our best to respond within five business days or less.
Join our [developers mailing list](https://groups.google.com/a/photoprism.org/forum/#!forum/developers)
to receive regular project updates, get in contact with other contributors and discuss your ideas. Don't be afraid to ask stupid questions.
## Not a Developer? No Problem ##
## Pull requests ##
You can also contribute by…
Issues labeled [help wanted](https://github.com/photoprism/photoprism/labels/help%20wanted) /
[easy](https://github.com/photoprism/photoprism/labels/easy) can be good (first) contributions.
Our [Developer Guide](https://github.com/photoprism/photoprism/wiki) contains all information necessary to get you started.
* answering questions in the [Community Chat](https://link.photoprism.app/chat), on [Reddit](https://link.photoprism.app/reddit) and in [GitHub Discussions](https://link.photoprism.app/discussions)
* helping us [translate](https://docs.photoprism.app/developer-guide/translations-weblate/) the Web UI on [Weblate](https://translate.photoprism.app/)
* [conducting research](https://github.com/photoprism/photoprism/issues?q=is%3Aopen+is%3Aissue+label%3Aresearch) and [improving the documentation](https://github.com/photoprism/photoprism/issues?q=is%3Aopen+is%3Aissue+label%3Adocs)
* publishing tutorials, blog posts, and podcasts
* voting for us on pages like:
* https://alternativeto.net/software/photoprism/about/
* https://www.saashub.com/google-photos-alternatives
* recommending PhotoPrism to your friends
Our [step-by-step guide](https://github.com/photoprism/photoprism/wiki/Pull-Requests) explains how to submit new features, bugfixes and documentation.
## Creating Bug Reports ##
## Funded issues ##
Before reporting a bug, please use our [Troubleshooting Checklists](https://docs.photoprism.app/getting-started/troubleshooting/)
to determine the cause of your problem. If you have a general question, need help, or an issue has not
(yet) been clearly identified:
You'll get a small reward for working on [funded issues](https://github.com/photoprism/photoprism/labels/IssueHunt), see [issuehunt.io](https://issuehunt.io/repos/119160553) for details. Note that issue descriptions may be outdated on their site. Rewards are paid out when all [acceptance criteria](https://github.com/photoprism/photoprism/wiki/Issues#user-stories) prioritized as MUST are met and your pull request was successfully merged.
- You are welcome to ask in our [Community Chat](https://link.photoprism.app/chat)
- or post your question in [GitHub Discussions](https://link.photoprism.app/discussions)
## Feature requests ##
### GitHub Issues ###
You are welcome to add specific feature requests directly to our [GitHub issue tracker](https://github.com/photoprism/photoprism/issues)
if no similar [idea](https://github.com/photoprism/photoprism/labels/idea)
or [todo](https://github.com/photoprism/photoprism/labels/todo) already exists.
Please don't use the issue tracker to ask general questions.
We kindly ask you not to report bugs via GitHub Issues **unless you are certain to have found a fully reproducible and previously unreported issue** that must be fixed directly in [our source code](https://github.com/photoprism/photoprism). Thank you for your careful consideration!
We also maintain a couple of pages in our [Developer Guide](https://github.com/photoprism/photoprism/wiki)
for collecting interesting ideas and feedback, e.g.
[Related](https://github.com/photoprism/photoprism/wiki/Related),
[Love](https://github.com/photoprism/photoprism/wiki/Love),
[Concerns](https://github.com/photoprism/photoprism/wiki/Concerns) and
[Research](https://github.com/photoprism/photoprism/wiki/Research).
- When reporting a problem, always include the software versions you are using and other information about your environment such as [browser, browser plugins](https://docs.photoprism.app/getting-started/troubleshooting/browsers/), operating system, [storage type](https://docs.photoprism.app/getting-started/troubleshooting/performance/#storage), [memory size](https://docs.photoprism.app/getting-started/troubleshooting/performance/#memory), and [processor](https://docs.photoprism.app/getting-started/troubleshooting/performance/#server-cpu)
- Note that all issue **subscribers receive an email notification** from GitHub whenever a new comment is added, so these should only be used for sharing important information and not for discussions, questions or expressing personal opinions
- [Contact us](https://www.photoprism.app/contact) or [a community member](https://link.photoprism.app/discussions) if you need help, it could be a local configuration problem, or a misunderstanding in how the software works
- This gives our team the opportunity to [improve the docs](https://docs.photoprism.app/getting-started/troubleshooting/) and provide best-in-class support to you, instead of handling unclear/duplicate bug reports or triggering a flood of notifications by responding to comments
## Reporting bugs ##
## Submitting Pull Requests ##
Follow our [step-by-step guide](https://docs.photoprism.app/developer-guide/pull-requests) to learn how to submit new features, bug fixes, and documentation enhancements.
Pull requests solving ["help wanted"](https://github.com/photoprism/photoprism/labels/help%20wanted) issues are the easiest to merge and the most helpful to us, as they allow us to spend more time on core functionality and other issues that are difficult for external contributors to work on. If you are new to this project, anything labeled ["easy"](https://github.com/photoprism/photoprism/labels/easy) may be a good first contribution.
**Be aware that reviewing, testing and finally merging pull requests requires significant resources on our side. It can therefore take several months if it is not just a small fix, especially if extensive testing is needed to prevent bugs from getting into our stable version.**
## Contributor License Agreement (CLA) ##
After you submit your first pull request, you will be asked to accept our Contributor License Agreement (CLA). Visit [photoprism.app/cla](https://www.photoprism.app/cla) and [photoprism.app/oss/faq](https://www.photoprism.app/oss/faq#cla) to learn more.
## Thank You to All Current and Past Sponsors 💎 ##
[A big thank you to all of our sponsors](SPONSORS.md), whose generous support has been and continues to be essential to the success of the project! 💜
Our project infrastructure is provided by the following companies:
- [**GitHub**](https://github.com/) hosts our [code repositories](https://github.com/photoprism/photoprism) and also provides many other important services
- [**Docker**](https://www.docker.com/) approved us for their [Open Source Program](https://www.docker.com/community/open-source/application/) and hosts all of our app images
- [**Element**](https://element.io/) develops and [operates the infrastructure](https://matrix.org/) that our [community chat](https://link.photoprism.app/chat) is based on
- [**BrowserStack**](https://www.browserstack.com/) provides [free access](https://www.browserstack.com/open-source) to their device and browser testing infrastructure
[View Sponsors ](SPONSORS.md)[View Credits ](https://docs.photoprism.app/credits/)
## Privacy Notice ##
We operate a number of web services that help us develop and maintain our software in collaboration with the open source community, for example [translate.photoprism.app](https://translate.photoprism.app/).
Because many of these apps and tools were originally developed for internal use without a high level of privacy in mind, we ask that you do not enter personal information such as your real name or personal email address if you want it to remain private.
**Personal details may otherwise show up in logs, source code, translation files, commit messages, and pull request comments.**
----
*PhotoPrism® is a [registered trademark](https://www.photoprism.app/trademark). By using the software and services we provide, you agree to our [Terms of Service](https://www.photoprism.app/terms), [Privacy Policy](https://www.photoprism.app/privacy), and [Code of Conduct](https://www.photoprism.app/code-of-conduct). Docs are [available](https://link.photoprism.app/github-docs) under the [CC BY-NC-SA 4.0 License](https://creativecommons.org/licenses/by-nc-sa/4.0/); [additional terms](https://github.com/photoprism/photoprism/blob/develop/assets/README.md) may apply.*
Please use the [GitHub issue tracker](https://github.com/photoprism/photoprism/issues) to report clearly identified bugs and impediments to us.
If you're not sure, start by asking in our [help forum](https://groups.google.com/a/photoprism.org/forum/#!forum/help) or [contact us via email](mailto:help@photoprism.org).
When reporting an issue, please provide the version in use and information about your environment like browser, operating system, installed memory, and processor type.

View file

@ -1,18 +1,5 @@
# Ubuntu 23.10 (Mantic Minotaur)
FROM photoprism/develop:231206-mantic
FROM photoprism/development:20191105
## Alternative Environments:
# FROM photoprism/develop:armv7 # ARMv7 (32bit)
# FROM photoprism/develop:lunar # Ubuntu 23.04 (Lunar Lobster)
# FROM photoprism/develop:jammy # Ubuntu 22.04 LTS (Jammy Jellyfish)
# FROM photoprism/develop:impish # Ubuntu 21.10 (Impish Indri)
# FROM photoprism/develop:bookworm # Debian 12 (Bookworm)
# FROM photoprism/develop:bullseye # Debian 11 (Bullseye)
# FROM photoprism/develop:buster # Debian 10 (Buster)
# Set default working directory.
# Set up project directory
WORKDIR "/go/src/github.com/photoprism/photoprism"
# Copy source to image.
COPY . .
COPY --chown=root:root /scripts/dist/ /scripts/

View file

@ -1,3 +0,0 @@
custom: "https://www.photoprism.app/editions#compare"
github: photoprism
patreon: photoprism

188
LICENSE
View file

@ -1,5 +1,5 @@
GNU AFFERO GENERAL PUBLIC LICENSE
Version 3, 19 November 2007
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
@ -7,15 +7,17 @@
Preamble
The GNU Affero General Public License is a free, copyleft license for
software and other kinds of works, specifically designed to ensure
cooperation with the community in the case of network server software.
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
our General Public Licenses are intended to guarantee your freedom to
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
@ -24,34 +26,44 @@ them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
Developers that use our General Public Licenses protect your rights
with two steps: (1) assert copyright on the software, and (2) offer
you this License which gives you legal permission to copy, distribute
and/or modify the software.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
A secondary benefit of defending all users' freedom is that
improvements made in alternate versions of the program, if they
receive widespread use, become available for other developers to
incorporate. Many developers of free software are heartened and
encouraged by the resulting cooperation. However, in the case of
software used on network servers, this result may fail to come about.
The GNU General Public License permits making a modified version and
letting the public access it on a server without ever releasing its
source code to the public.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
The GNU Affero General Public License is designed specifically to
ensure that, in such cases, the modified source code becomes available
to the community. It requires the operator of a network server to
provide the source code of the modified version running there to the
users of that server. Therefore, public use of a modified version, on
a publicly accessible server, gives the public access to the source
code of the modified version.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
An older license, called the Affero General Public License and
published by Affero, was designed to accomplish similar goals. This is
a different license, not a version of the Affero GPL, but Affero has
released a new version of the Affero GPL which permits relicensing under
this license.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
@ -60,7 +72,7 @@ modification follow.
0. Definitions.
"This License" refers to version 3 of the GNU Affero General Public License.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
@ -537,45 +549,35 @@ to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Remote Network Interaction; Use with the GNU General Public License.
Notwithstanding any other provision of this License, if you modify the
Program, your modified version must prominently offer all users
interacting with it remotely through a computer network (if your version
supports such interaction) an opportunity to receive the Corresponding
Source of your version by providing access to the Corresponding Source
from a network server at no charge, through some standard or customary
means of facilitating copying of software. This Corresponding Source
shall include the Corresponding Source for any work covered by version 3
of the GNU General Public License that is incorporated pursuant to the
following paragraph.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU General Public License into a single
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the work with which it is combined will remain governed by version
3 of the GNU General Public License.
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU Affero General Public License from time to time. Such new versions
will be similar in spirit to the present version, but may differ in detail to
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU Affero General
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU Affero General Public License, you may choose any version ever published
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU Affero General Public License can be used, that proxy's
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
@ -616,31 +618,57 @@ an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
ADDITIONAL TERMS
18. PhotoPrism® Trademark and Brand Assets
(a) PhotoPrisms Brand Assets — including trademarks, logos, icons, fonts,
corporate design, product and service names, and any other brand features
and elements, whether registered or unregistered („Brand Assets“) — are
proprietary assets owned exclusively by PhotoPrism UG („PhotoPrism“). We
reserve the right to object to any use or misuse in any jurisdiction
worldwide. Visit <https://www.photoprism.app/trademark> to learn more.
(b) Contributors, licensees, business partners, and other third parties
may never claim ownership of PhotoPrism's Brand Assets or brands confusingly
similar to PhotoPrism's Brand Assets in any way, including, without
limitation, as a trademark, service mark, company name or designation,
domain name, social media profile/handle, or in any other manner.
(c) You may not include the PhotoPrism trademark in the name of your app,
product, or service, whether commercial or non-commercial in nature. This
includes online services such as e-commerce, community, blog, information,
advertising, and personal home pages, as well as apps, app stores, client
apps, or third-party apps that interact with PhotoPrism.
(d) In the event that any provision is found to be unenforceable by a court
or other competent jurisdiction, the remaining portions hereof shall remain
in full force and effect.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.

686
Makefile
View file

@ -1,646 +1,130 @@
# Copyright © 2018 - 2023 PhotoPrism UG. All rights reserved.
#
# Questions? Email us at hello@photoprism.app or visit our website to learn
# more about our team, products and services: https://www.photoprism.app/
export GO111MODULE=on
-include .env
export
# Binary file names.
BINARY_NAME=photoprism
GOIMPORTS=goimports
BINARY_NAME=photoprism
DOCKER_TAG=`date -u +%Y%m%d`
TIDB_VERSION=2.1.11
TF_VERSION=1.14.0
DARKTABLE_VERSION="$(awk '$2 == "DARKTABLE_VERSION" { print $3; exit }' docker/darktable/Dockerfile)"
# Build parameters.
BUILD_PATH ?= $(shell realpath "./build")
BUILD_DATE ?= $(shell date -u +%y%m%d)
BUILD_VERSION ?= $(shell git describe --always)
BUILD_TAG ?= $(BUILD_DATE)-$(BUILD_VERSION)
BUILD_OS ?= $(shell uname -s)
BUILD_ARCH ?= $(shell scripts/dist/arch.sh)
JS_BUILD_PATH ?= $(shell realpath "./assets/static/build")
# Install parameters.
INSTALL_PATH ?= $(BUILD_PATH)/photoprism-ce_$(BUILD_TAG)-$(shell echo $(BUILD_OS) | tr '[:upper:]' '[:lower:]')-$(BUILD_ARCH)
DESTDIR ?= $(INSTALL_PATH)
DESTUID ?= 1000
DESTGID ?= 1000
INSTALL_USER ?= $(DESTUID):$(DESTGID)
INSTALL_MODE ?= u+rwX,a+rX
INSTALL_MODE_BIN ?= 755
UID := $(shell id -u)
GID := $(shell id -g)
HASRICHGO := $(shell which richgo)
ifdef HASRICHGO
GOTEST=richgo test
else
GOTEST=go test
endif
# Ensure compatibility with "docker-compose" (old) and "docker compose" (new).
HAS_DOCKER_COMPOSE_WITH_DASH := $(shell which docker-compose)
ifdef HAS_DOCKER_COMPOSE_WITH_DASH
DOCKER_COMPOSE=docker-compose
else
DOCKER_COMPOSE=docker compose
endif
# Declare "make" targets.
all: dep build-js
dep: dep-tensorflow dep-js
biuld: build
build: build-go
build-all: build-go build-js
pull: docker-pull
all: dep build
dep: dep-tensorflow dep-js dep-go
build: build-js build-go
install: install-bin install-assets
test: test-js test-go
test-go: reset-sqlite run-test-go
test-pkg: reset-sqlite run-test-pkg
test-api: reset-sqlite run-test-api
test-commands: reset-sqlite run-test-commands
test-photoprism: reset-sqlite run-test-photoprism
test-short: reset-sqlite run-test-short
test-mariadb: reset-acceptance run-test-mariadb
acceptance-run-chromium: storage/acceptance acceptance-auth-sqlite-restart wait acceptance-auth acceptance-auth-sqlite-stop acceptance-sqlite-restart wait-2 acceptance acceptance-sqlite-stop
acceptance-run-chromium-short: storage/acceptance acceptance-auth-sqlite-restart wait acceptance-auth-short acceptance-auth-sqlite-stop acceptance-sqlite-restart wait-2 acceptance-short acceptance-sqlite-stop
acceptance-auth-run-chromium: storage/acceptance acceptance-auth-sqlite-restart wait acceptance-auth acceptance-auth-sqlite-stop
acceptance-public-run-chromium: storage/acceptance acceptance-sqlite-restart wait acceptance acceptance-sqlite-stop
wait:
sleep 20
wait-2:
sleep 20
show-build:
@echo "$(BUILD_TAG)"
test-all: test acceptance-run-chromium
acceptance: start test-chromium test-firefox stop
fmt: fmt-js fmt-go
clean-local: clean-local-config clean-local-cache
upgrade: dep-upgrade-js dep-upgrade
devtools: install-go dep-npm
.SILENT: help;
logs:
$(DOCKER_COMPOSE) logs -f
help:
@echo "For build instructions, visit <https://docs.photoprism.app/developer-guide/>."
fix-permissions:
$(info Updating filesystem permissions...)
@if [ $(UID) != 0 ]; then\
echo "Running \"chown --preserve-root -Rcf $(UID):$(GID) /go /photoprism /opt/photoprism /tmp/photoprism\". Please wait."; \
sudo chown --preserve-root -Rcf $(UID):$(GID) /go /photoprism /opt/photoprism /tmp/photoprism || true;\
echo "Running \"chmod --preserve-root -Rcf u+rwX /go/src/github.com/photoprism/* /photoprism /opt/photoprism /tmp/photoprism\". Please wait.";\
sudo chmod --preserve-root -Rcf u+rwX /go/src/github.com/photoprism/photoprism/* /photoprism /opt/photoprism /tmp/photoprism || true;\
echo "Done."; \
else\
echo "Running as root. Nothing to do."; \
fi
gettext-merge:
./scripts/gettext-merge.sh
gettext-clear-fuzzy:
./scripts/gettext-clear-fuzzy.sh
clean:
rm -f *.log .test*
[ ! -f "$(BINARY_NAME)" ] || rm -f $(BINARY_NAME)
[ ! -d "node_modules" ] || rm -rf node_modules
[ ! -d "frontend/node_modules" ] || rm -rf frontend/node_modules
[ ! -d "$(BUILD_PATH)" ] || rm -rf --preserve-root $(BUILD_PATH)
[ ! -d "$(JS_BUILD_PATH)" ] || rm -rf --preserve-root $(JS_BUILD_PATH)
tar.gz:
$(info Creating tar.gz archives from the directories in "$(BUILD_PATH)"...)
find "$(BUILD_PATH)" -maxdepth 1 -mindepth 1 -type d -name "photoprism*" -exec tar --exclude='.[^/]*' -C {} -czf {}.tar.gz . \;
pkg: pkg-amd64 pkg-arm64
pkg-amd64:
docker run --rm -u $(UID) --platform=amd64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" --entrypoint "" photoprism/develop:jammy make all install tar.gz
pkg-arm64:
docker run --rm -u $(UID) --platform=arm64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" --entrypoint "" photoprism/develop:jammy make all install tar.gz
install:
$(info Installing in "$(DESTDIR)"...)
@[ ! -d "$(DESTDIR)" ] || (echo "ERROR: Install path '$(DESTDIR)' already exists!"; exit 1)
mkdir --mode=$(INSTALL_MODE) -p $(DESTDIR)
env TMPDIR="$(BUILD_PATH)" ./scripts/dist/install-tensorflow.sh $(DESTDIR)
rm -rf --preserve-root $(DESTDIR)/include
(cd $(DESTDIR) && mkdir -p bin lib assets)
./scripts/build.sh prod "$(DESTDIR)/bin/$(BINARY_NAME)"
rsync -r -l --safe-links --exclude-from=assets/.buildignore --chmod=a+r,u+rw ./assets/ $(DESTDIR)/assets
wget -O $(DESTDIR)/assets/static/img/wallpaper/welcome.jpg https://cdn.photoprism.app/wallpaper/welcome.jpg
wget -O $(DESTDIR)/assets/static/img/preview.jpg https://cdn.photoprism.app/img/preview.jpg
chown -R $(INSTALL_USER) $(DESTDIR)
chmod -R $(INSTALL_MODE) $(DESTDIR)
chmod -R $(INSTALL_MODE_BIN) $(DESTDIR)/bin $(DESTDIR)/lib
@echo "PhotoPrism $(BUILD_TAG) has been successfully installed in \"$(DESTDIR)\".\nEnjoy!"
install-go:
sudo scripts/dist/install-go.sh
go build -v ./...
install-tensorflow:
sudo scripts/dist/install-tensorflow.sh
install-darktable:
sudo scripts/dist/install-darktable.sh
acceptance-sqlite-restart:
cp -f storage/acceptance/backup.db storage/acceptance/index.db
cp -f storage/acceptance/config-sqlite/settingsBackup.yml storage/acceptance/config-sqlite/settings.yml
rm -rf storage/acceptance/sidecar/2020
rm -rf storage/acceptance/sidecar/2011
rm -rf storage/acceptance/originals/2010
rm -rf storage/acceptance/originals/2020
rm -rf storage/acceptance/originals/2011
rm -rf storage/acceptance/originals/2013
rm -rf storage/acceptance/originals/2017
./photoprism --auth-mode="public" -c "./storage/acceptance/config-sqlite" --test start -d
acceptance-sqlite-stop:
./photoprism --auth-mode="public" -c "./storage/acceptance/config-sqlite" --test stop
acceptance-auth-sqlite-restart:
cp -f storage/acceptance/backup.db storage/acceptance/index.db
cp -f storage/acceptance/config-sqlite/settingsBackup.yml storage/acceptance/config-sqlite/settings.yml
./photoprism --auth-mode="password" -c "./storage/acceptance/config-sqlite" --test start -d
acceptance-auth-sqlite-stop:
./photoprism --auth-mode="password" -c "./storage/acceptance/config-sqlite" --test stop
upgrade: upgrade-js upgrade-go
start:
./photoprism start -d
go run cmd/photoprism/photoprism.go start -d
stop:
./photoprism stop
go run cmd/photoprism/photoprism.go stop
terminal:
$(DOCKER_COMPOSE) exec -u $(UID) photoprism bash
rootshell: root-terminal
root-terminal:
$(DOCKER_COMPOSE) exec -u root photoprism bash
docker-compose exec photoprism bash
migrate:
go run cmd/photoprism/photoprism.go migrations run
generate:
POT_SIZE_BEFORE=$(shell stat -L -c %s assets/locales/messages.pot)
go generate ./pkg/... ./internal/...
go fmt ./pkg/... ./internal/...
POT_SIZE_AFTER=$(shell stat -L -c %s assets/locales/messages.pot)
@if [ $(POT_SIZE_BEFORE) == $(POT_SIZE_AFTER) ]; then\
git checkout -- assets/locales/messages.pot;\
echo "Reverted unnecessary change in assets/locales/messages.pot.";\
fi
go-generate:
go generate ./pkg/... ./internal/...
go fmt ./pkg/... ./internal/...
clean-local-assets:
rm -rf $(BUILD_PATH)/assets/*
clean-local-cache:
rm -rf $(BUILD_PATH)/storage/cache/*
clean-local-config:
rm -f $(BUILD_PATH)/config/*
dep-list:
go list -u -m -json all | go-mod-outdated -direct
dep-npm:
sudo npm install -g npm
go run cmd/photoprism/photoprism.go migrate
install-bin:
scripts/build.sh prod ~/.local/bin/$(BINARY_NAME)
install-assets:
$(info Installing assets in ~/photoprism)
mkdir -p ~/.config/photoprism
mkdir -p ~/.cache/photoprism
mkdir -p ~/Pictures/Originals
mkdir -p ~/Pictures/Import
mkdir -p ~/Pictures/Export
mkdir -p ~/.local/share/photoprism/resources/database
cp -r assets/resources/static assets/resources/templates assets/resources/nasnet ~/.local/share/photoprism/resources
rsync -a -v --ignore-existing assets/config/*.yml ~/.config/photoprism
find ~/.local/share/photoprism -name '.*' -type f -delete
dep-js:
(cd frontend && npm ci --no-update-notifier --no-audit)
(cd frontend && npm install)
dep-go:
go build -v ./...
dep-upgrade:
go get -u -t ./...
dep-upgrade-js:
(cd frontend && npm --depth 3 update --legacy-peer-deps)
dep-tensorflow:
scripts/download-facenet.sh
scripts/download-nasnet.sh
scripts/download-nsfw.sh
dep-acceptance: storage/acceptance
storage/acceptance:
[ -f "./storage/acceptance/index.db" ] || (cd storage && rm -rf acceptance && wget -c https://dl.photoprism.app/qa/acceptance.tar.gz -O - | tar -xz)
zip-facenet:
(cd assets && zip -r facenet.zip facenet -x "*/.*" -x "*/version.txt")
zip-nasnet:
(cd assets && zip -r nasnet.zip nasnet -x "*/.*" -x "*/version.txt")
zip-nsfw:
(cd assets && zip -r nsfw.zip nsfw -x "*/.*" -x "*/version.txt")
(cd assets/resources && zip -r nasnet.zip nasnet -x "*/.*" -x "*/version.txt")
build-js:
(cd frontend && env NODE_ENV=production npm run build)
build-go: build-debug
build-debug:
build-go:
rm -f $(BINARY_NAME)
scripts/build.sh debug $(BINARY_NAME)
build-prod:
rm -f $(BINARY_NAME)
scripts/build.sh prod $(BINARY_NAME)
build-race:
rm -f $(BINARY_NAME)
scripts/build.sh race $(BINARY_NAME)
build-static:
rm -f $(BINARY_NAME)
scripts/build.sh static $(BINARY_NAME)
build-tensorflow:
docker build -t photoprism/tensorflow:build docker/tensorflow
docker run -ti photoprism/tensorflow:build bash
build-tensorflow-arm64:
docker build -t photoprism/tensorflow:arm64 docker/tensorflow/arm64
docker run -ti photoprism/tensorflow:arm64 bash
watch-js:
(cd frontend && env NODE_ENV=development npm run watch)
test-js:
$(info Running JS unit tests...)
(cd frontend && env TZ=UTC NODE_ENV=development BABEL_ENV=test npm run test)
acceptance:
$(info Running public-mode tests in 'chromium:headless'...)
(cd frontend && npm run testcafe -- chrome:headless --test-grep "^(Common|Core)\:*" --test-meta mode=public --config-file ./testcaferc.json "tests/acceptance")
acceptance-short:
(cd frontend && env NODE_ENV=development BABEL_ENV=test npm run test)
test-chromium:
$(info Running JS acceptance tests in Chrome...)
(cd frontend && npm run testcafe -- chrome:headless --test-grep "^(Common|Core)\:*" --test-meta mode=public,type=short --config-file ./testcaferc.json "tests/acceptance")
acceptance-firefox:
(cd frontend && npm run test-chromium)
test-firefox:
$(info Running JS acceptance tests in Firefox...)
(cd frontend && npm run testcafe -- firefox:headless --test-grep "^(Common|Core)\:*" --test-meta mode=public --config-file ./testcaferc.json "tests/acceptance")
acceptance-auth:
$(info Running JS acceptance-auth tests in Chrome...)
(cd frontend && npm run testcafe -- chrome:headless --test-grep "^(Common|Core)\:*" --test-meta mode=auth --config-file ./testcaferc.json "tests/acceptance")
acceptance-auth-short:
$(info Running JS acceptance-auth tests in Chrome...)
(cd frontend && npm run testcafe -- chrome:headless --test-grep "^(Common|Core)\:*" --test-meta mode=auth,type=short --config-file ./testcaferc.json "tests/acceptance")
acceptance-auth-firefox:
$(info Running JS acceptance-auth tests in Firefox...)
(cd frontend && npm run testcafe -- firefox:headless --test-grep "^(Common|Core)\:*" --test-meta mode=auth --config-file ./testcaferc.json "tests/acceptance")
reset-mariadb:
$(info Resetting photoprism database...)
mysql < scripts/sql/reset-photoprism.sql
reset-mariadb-testdb:
$(info Resetting testdb database...)
mysql < scripts/sql/reset-testdb.sql
reset-mariadb-local:
$(info Resetting local database...)
mysql < scripts/sql/reset-local.sql
reset-mariadb-acceptance:
$(info Resetting acceptance database...)
mysql < scripts/sql/reset-acceptance.sql
reset-mariadb-all: reset-mariadb-testdb reset-mariadb-local reset-mariadb-acceptance reset-mariadb-photoprism
reset-testdb: reset-sqlite reset-mariadb-testdb
reset-acceptance: reset-mariadb-acceptance
reset-sqlite:
$(info Removing test database files...)
find ./internal -type f -name ".test.*" -delete
run-test-short:
$(info Running short Go tests in parallel mode...)
$(GOTEST) -parallel 2 -count 1 -cpu 2 -short -timeout 5m ./pkg/... ./internal/...
run-test-go:
$(info Running all Go tests...)
$(GOTEST) -parallel 1 -count 1 -cpu 1 -tags slow -timeout 20m ./pkg/... ./internal/...
run-test-mariadb:
$(info Running all Go tests on MariaDB...)
PHOTOPRISM_TEST_DRIVER="mysql" PHOTOPRISM_TEST_DSN="root:photoprism@tcp(mariadb:4001)/acceptance?charset=utf8mb4,utf8&collation=utf8mb4_unicode_ci&parseTime=true" $(GOTEST) -parallel 1 -count 1 -cpu 1 -tags slow -timeout 20m ./pkg/... ./internal/...
run-test-pkg:
$(info Running all Go tests in "/pkg"...)
$(GOTEST) -parallel 2 -count 1 -cpu 2 -tags slow -timeout 20m ./pkg/...
run-test-api:
$(info Running all API tests...)
$(GOTEST) -parallel 2 -count 1 -cpu 2 -tags slow -timeout 20m ./internal/api/...
run-test-commands:
$(info Running all CLI command tests...)
$(GOTEST) -parallel 2 -count 1 -cpu 2 -tags slow -timeout 20m ./internal/commands/...
run-test-photoprism:
$(info Running all Go tests in "/internal/photoprism"...)
$(GOTEST) -parallel 2 -count 1 -cpu 2 -tags slow -timeout 20m ./internal/photoprism/...
test-parallel:
$(info Running all Go tests in parallel mode...)
$(GOTEST) -parallel 2 -count 1 -cpu 2 -tags slow -timeout 20m ./pkg/... ./internal/...
(cd frontend && npm run test-firefox)
test-go:
$(info Running all Go unit tests...)
$(GOTEST) -count=1 -tags=slow -timeout 20m ./internal/...
test-verbose:
$(info Running all Go tests in verbose mode...)
$(GOTEST) -parallel 1 -count 1 -cpu 1 -tags slow -timeout 20m -v ./pkg/... ./internal/...
$(info Running all Go unit tests in verbose mode...)
$(GOTEST) -tags=slow -timeout 20m -v ./internal/...
test-short:
$(info Running short Go unit tests in verbose mode...)
$(GOTEST) -short -timeout 5m -v ./internal/...
test-race:
$(info Running all Go tests with race detection in verbose mode...)
$(GOTEST) -tags slow -race -timeout 60m -v ./pkg/... ./internal/...
$(info Running all Go unit tests with race detection in verbose mode...)
$(GOTEST) -tags=slow -race -timeout 60m -v ./internal/...
test-codecov:
$(info Running all Go unit tests with code coverage report for codecov...)
go test -count=1 -tags=slow -timeout 30m -coverprofile=coverage.txt -covermode=atomic -v ./internal/...
scripts/codecov.sh
test-coverage:
$(info Running all Go tests with code coverage report...)
go test -parallel 1 -count 1 -cpu 1 -failfast -tags slow -timeout 30m -coverprofile coverage.txt -covermode atomic ./pkg/... ./internal/...
$(info Running all Go unit tests with code coverage report...)
go test -count=1 -tags=slow -timeout 30m -coverprofile=coverage.txt -covermode=atomic -v ./internal/...
go tool cover -html=coverage.txt -o coverage.html
go tool cover -func coverage.txt | grep total:
docker-pull:
$(DOCKER_COMPOSE) pull --ignore-pull-failures
$(DOCKER_COMPOSE) -f docker-compose.latest.yml pull --ignore-pull-failures
docker-build:
$(DOCKER_COMPOSE) pull --ignore-pull-failures
$(DOCKER_COMPOSE) build
docker-local-up:
$(DOCKER_COMPOSE) -f docker-compose.local.yml up --force-recreate
docker-local-down:
$(DOCKER_COMPOSE) -f docker-compose.local.yml down -V
develop: docker-develop
docker-develop: docker-develop-latest
docker-develop-all: docker-develop-latest docker-develop-other
docker-develop-latest: docker-develop-ubuntu
docker-develop-debian: docker-develop-bookworm docker-develop-bookworm-slim
docker-develop-ubuntu: docker-develop-mantic docker-develop-mantic-slim
docker-develop-other: docker-develop-debian docker-develop-bullseye docker-develop-bullseye-slim docker-develop-buster
docker-develop-bookworm:
docker pull --platform=amd64 debian:bookworm-slim
docker pull --platform=arm64 debian:bookworm-slim
scripts/docker/buildx-multi.sh develop linux/amd64,linux/arm64 bookworm /bookworm "-t photoprism/develop:debian"
docker-develop-bookworm-slim:
docker pull --platform=amd64 debian:bookworm-slim
docker pull --platform=arm64 debian:bookworm-slim
scripts/docker/buildx-multi.sh develop linux/amd64,linux/arm64 bookworm-slim /bookworm-slim
docker-develop-bullseye:
docker pull --platform=amd64 golang:1-bullseye
docker pull --platform=arm64 golang:1-bullseye
scripts/docker/buildx-multi.sh develop linux/amd64,linux/arm64 bullseye /bullseye
docker-develop-bullseye-slim:
docker pull --platform=amd64 debian:bullseye-slim
docker pull --platform=arm64 debian:bullseye-slim
scripts/docker/buildx-multi.sh develop linux/amd64,linux/arm64 bullseye-slim /bullseye-slim
develop-armv7: docker-develop-armv7
docker-develop-armv7:
docker pull --platform=arm ubuntu:mantic
scripts/docker/buildx.sh develop linux/arm armv7 /armv7
docker-develop-buster:
docker pull --platform=amd64 golang:1-buster
docker pull --platform=arm64 golang:1-buster
scripts/docker/buildx-multi.sh develop linux/amd64,linux/arm64 buster /buster
docker-develop-impish:
docker pull --platform=amd64 ubuntu:impish
docker pull --platform=arm64 ubuntu:impish
scripts/docker/buildx-multi.sh develop linux/amd64,linux/arm64 impish /impish
docker-develop-jammy:
docker pull --platform=amd64 ubuntu:jammy
docker pull --platform=arm64 ubuntu:jammy
scripts/docker/buildx-multi.sh develop linux/amd64,linux/arm64 jammy /jammy
docker-develop-jammy-slim:
docker pull --platform=amd64 ubuntu:jammy
docker pull --platform=arm64 ubuntu:jammy
scripts/docker/buildx-multi.sh develop linux/amd64,linux/arm64 jammy-slim /jammy-slim
docker-develop-lunar:
docker pull --platform=amd64 ubuntu:lunar
docker pull --platform=arm64 ubuntu:lunar
scripts/docker/buildx-multi.sh develop linux/amd64,linux/arm64 lunar /lunar
docker-develop-lunar-slim:
docker pull --platform=amd64 ubuntu:lunar
docker pull --platform=arm64 ubuntu:lunar
scripts/docker/buildx-multi.sh develop linux/amd64,linux/arm64 lunar-slim /lunar-slim
docker-develop-mantic:
docker pull --platform=amd64 ubuntu:mantic
docker pull --platform=arm64 ubuntu:mantic
scripts/docker/buildx-multi.sh develop linux/amd64,linux/arm64 mantic /mantic "-t photoprism/develop:latest -t photoprism/develop:ubuntu"
docker-develop-mantic-slim:
docker pull --platform=amd64 ubuntu:mantic
docker pull --platform=arm64 ubuntu:mantic
scripts/docker/buildx-multi.sh develop linux/amd64,linux/arm64 mantic-slim /mantic-slim
unstable: docker-unstable
docker-unstable: docker-unstable-mantic
docker-unstable-jammy:
docker pull --platform=amd64 photoprism/develop:jammy
docker pull --platform=amd64 photoprism/develop:jammy-slim
scripts/docker/buildx-multi.sh photoprism linux/amd64 unstable-ce /jammy
docker-unstable-lunar:
docker pull --platform=amd64 photoprism/develop:lunar
docker pull --platform=amd64 photoprism/develop:lunar-slim
scripts/docker/buildx-multi.sh photoprism linux/amd64 unstable-ce /lunar
docker-unstable-mantic:
docker pull --platform=amd64 photoprism/develop:mantic
docker pull --platform=amd64 photoprism/develop:mantic-slim
scripts/docker/buildx-multi.sh photoprism linux/amd64 unstable-ce /mantic
preview: docker-preview-ce
docker-preview: docker-preview-ce
docker-preview-all: docker-preview-latest docker-preview-other
docker-preview-ce: docker-preview-mantic
docker-preview-latest: docker-preview-ubuntu
docker-preview-debian: docker-preview-bookworm
docker-preview-ubuntu: docker-preview-mantic
docker-preview-other: docker-preview-debian docker-preview-bullseye
docker-preview-arm: docker-preview-arm64 docker-preview-armv7
docker-preview-bookworm:
docker pull --platform=amd64 photoprism/develop:bookworm
docker pull --platform=amd64 photoprism/develop:bookworm-slim
docker pull --platform=arm64 photoprism/develop:bookworm
docker pull --platform=arm64 photoprism/develop:bookworm-slim
scripts/docker/buildx-multi.sh photoprism linux/amd64,linux/arm64 preview-bookworm /bookworm "-t photoprism/photoprism:preview-ce-debian"
docker-preview-armv7:
docker pull --platform=arm photoprism/develop:armv7
docker pull --platform=arm ubuntu:mantic
scripts/docker/buildx.sh photoprism linux/arm preview-armv7 /armv7
docker-preview-arm64:
docker pull --platform=arm64 photoprism/develop:lunar
docker pull --platform=arm64 photoprism/develop:lunar-slim
scripts/docker/buildx.sh photoprism linux/arm64 preview-arm64 /lunar
docker-preview-bullseye:
docker pull --platform=amd64 photoprism/develop:bullseye
docker pull --platform=amd64 photoprism/develop:bullseye-slim
docker pull --platform=arm64 photoprism/develop:bullseye
docker pull --platform=arm64 photoprism/develop:bullseye-slim
scripts/docker/buildx-multi.sh photoprism linux/amd64,linux/arm64 preview-bullseye /bullseye
docker-preview-buster:
docker pull --platform=amd64 photoprism/develop:buster
docker pull --platform=arm64 photoprism/develop:buster
docker pull --platform=amd64 debian:buster-slim
docker pull --platform=arm64 debian:buster-slim
scripts/docker/buildx-multi.sh photoprism linux/amd64,linux/arm64 preview-buster /buster
docker-preview-impish:
docker pull --platform=amd64 photoprism/develop:impish
docker pull --platform=arm64 photoprism/develop:impish
docker pull --platform=amd64 ubuntu:impish
docker pull --platform=arm64 ubuntu:impish
scripts/docker/buildx-multi.sh photoprism linux/amd64,linux/arm64 preview-impish /impish
docker-preview-jammy:
docker pull --platform=amd64 photoprism/develop:jammy
docker pull --platform=amd64 photoprism/develop:jammy-slim
docker pull --platform=arm64 photoprism/develop:jammy
docker pull --platform=arm64 photoprism/develop:jammy-slim
scripts/docker/buildx-multi.sh photoprism linux/amd64,linux/arm64 preview-ce /jammy
docker-preview-lunar:
docker pull --platform=amd64 photoprism/develop:lunar
docker pull --platform=amd64 photoprism/develop:lunar-slim
docker pull --platform=arm64 photoprism/develop:lunar
docker pull --platform=arm64 photoprism/develop:lunar-slim
scripts/docker/buildx-multi.sh photoprism linux/amd64,linux/arm64 preview-ce /lunar
docker-preview-mantic:
docker pull --platform=amd64 photoprism/develop:mantic
docker pull --platform=amd64 photoprism/develop:mantic-slim
docker pull --platform=arm64 photoprism/develop:mantic
docker pull --platform=arm64 photoprism/develop:mantic-slim
scripts/docker/buildx-multi.sh photoprism linux/amd64,linux/arm64 preview-ce /mantic
release: docker-release
docker-release: docker-release-latest
docker-release-all: docker-release-latest docker-release-other
docker-release-latest: docker-release-ubuntu
docker-release-debian: docker-release-bookworm
docker-release-ubuntu: docker-release-mantic
docker-release-other: docker-release-debian docker-release-bullseye
docker-release-arm: docker-release-arm64 docker-release-armv7
docker-release-bookworm:
docker pull --platform=amd64 photoprism/develop:bookworm
docker pull --platform=amd64 photoprism/develop:bookworm-slim
docker pull --platform=arm64 photoprism/develop:bookworm
docker pull --platform=arm64 photoprism/develop:bookworm-slim
scripts/docker/buildx-multi.sh photoprism linux/amd64,linux/arm64 ce-bookworm /bookworm "-t photoprism/photoprism:ce-debian"
docker-release-armv7:
docker pull --platform=arm photoprism/develop:armv7
docker pull --platform=arm ubuntu:mantic
scripts/docker/buildx.sh photoprism linux/arm armv7 /armv7
docker-release-arm64:
docker pull --platform=arm64 photoprism/develop:lunar
docker pull --platform=arm64 photoprism/develop:lunar-slim
scripts/docker/buildx.sh photoprism linux/arm64 ce-arm64 /lunar
docker-release-bullseye:
docker pull --platform=amd64 photoprism/develop:bullseye
docker pull --platform=amd64 photoprism/develop:bullseye-slim
docker pull --platform=arm64 photoprism/develop:bullseye
docker pull --platform=arm64 photoprism/develop:bullseye-slim
scripts/docker/buildx-multi.sh photoprism linux/amd64,linux/arm64 ce-bullseye /bullseye
docker-release-buster:
docker pull --platform=amd64 photoprism/develop:buster
docker pull --platform=arm64 photoprism/develop:buster
docker pull --platform=amd64 debian:buster-slim
docker pull --platform=arm64 debian:buster-slim
scripts/docker/buildx-multi.sh photoprism linux/amd64,linux/arm64 ce-buster /buster
docker-release-impish:
docker pull --platform=amd64 photoprism/develop:impish
docker pull --platform=arm64 photoprism/develop:impish
docker pull --platform=amd64 ubuntu:impish
docker pull --platform=arm64 ubuntu:impish
scripts/docker/buildx-multi.sh photoprism linux/amd64,linux/arm64 ce-impish /impish
docker-release-jammy:
docker pull --platform=amd64 photoprism/develop:jammy
docker pull --platform=amd64 photoprism/develop:jammy-slim
docker pull --platform=arm64 photoprism/develop:jammy
docker pull --platform=arm64 photoprism/develop:jammy-slim
scripts/docker/buildx-multi.sh photoprism linux/amd64,linux/arm64 ce-jammy /jammy
docker-release-lunar:
docker pull --platform=amd64 photoprism/develop:lunar
docker pull --platform=amd64 photoprism/develop:lunar-slim
docker pull --platform=arm64 photoprism/develop:lunar
docker pull --platform=arm64 photoprism/develop:lunar-slim
scripts/docker/buildx-multi.sh photoprism linux/amd64,linux/arm64 ce /lunar
docker-release-mantic:
docker pull --platform=amd64 photoprism/develop:mantic
docker pull --platform=amd64 photoprism/develop:mantic-slim
docker pull --platform=arm64 photoprism/develop:mantic
docker pull --platform=arm64 photoprism/develop:mantic-slim
scripts/docker/buildx-multi.sh photoprism linux/amd64,linux/arm64 ce /mantic
start-local:
$(DOCKER_COMPOSE) -f docker-compose.local.yml up -d --wait
stop-local:
$(DOCKER_COMPOSE) -f docker-compose.local.yml stop
mysql:
$(DOCKER_COMPOSE) -f docker-compose.mysql.yml pull mysql
$(DOCKER_COMPOSE) -f docker-compose.mysql.yml stop mysql
$(DOCKER_COMPOSE) -f docker-compose.mysql.yml up -d --wait mysql
start-mysql:
$(DOCKER_COMPOSE) -f docker-compose.mysql.yml up -d --wait mysql
stop-mysql:
$(DOCKER_COMPOSE) -f docker-compose.mysql.yml stop mysql
logs-mysql:
$(DOCKER_COMPOSE) -f docker-compose.mysql.yml logs -f mysql
latest:
$(DOCKER_COMPOSE) -f docker-compose.latest.yml pull photoprism-latest
$(DOCKER_COMPOSE) -f docker-compose.latest.yml stop photoprism-latest
$(DOCKER_COMPOSE) -f docker-compose.latest.yml up -d --wait photoprism-latest
start-latest:
$(DOCKER_COMPOSE) -f docker-compose.latest.yml up photoprism-latest
stop-latest:
$(DOCKER_COMPOSE) -f docker-compose.latest.yml stop photoprism-latest
terminal-latest:
$(DOCKER_COMPOSE) -f docker-compose.latest.yml exec photoprism-latest bash
logs-latest:
$(DOCKER_COMPOSE) -f docker-compose.latest.yml logs -f photoprism-latest
docker-local: docker-local-mantic
docker-local-all: docker-local-mantic docker-local-lunar docker-local-jammy docker-local-bookworm docker-local-bullseye docker-local-buster
docker-local-bookworm:
docker pull photoprism/develop:bookworm
docker pull photoprism/develop:bookworm-slim
scripts/docker/build.sh photoprism ce-bookworm /bookworm "-t photoprism/photoprism:local"
docker-local-bullseye:
docker pull photoprism/develop:bullseye
docker pull photoprism/develop:bullseye-slim
scripts/docker/build.sh photoprism ce-bullseye /bullseye "-t photoprism/photoprism:local"
docker-local-buster:
docker pull photoprism/develop:buster
docker pull debian:buster-slim
scripts/docker/build.sh photoprism ce-buster /buster "-t photoprism/photoprism:local"
docker-local-impish:
docker pull photoprism/develop:impish
docker pull ubuntu:impish
scripts/docker/build.sh photoprism ce-impish /impish "-t photoprism/photoprism:local"
docker-local-jammy:
docker pull photoprism/develop:jammy
docker pull ubuntu:jammy
scripts/docker/build.sh photoprism ce-jammy /jammy "-t photoprism/photoprism:local"
docker-local-lunar:
docker pull photoprism/develop:lunar
docker pull ubuntu:lunar
scripts/docker/build.sh photoprism ce-lunar /lunar "-t photoprism/photoprism:local"
docker-local-mantic:
docker pull photoprism/develop:mantic
docker pull ubuntu:mantic
scripts/docker/build.sh photoprism ce-mantic /mantic "-t photoprism/photoprism:local"
docker-local-develop: docker-local-develop-mantic
docker-local-develop-all: docker-local-develop-mantic docker-local-develop-lunar docker-local-develop-jammy docker-local-develop-bookworm docker-local-develop-bullseye docker-local-develop-buster docker-local-develop-impish
docker-local-develop-bookworm:
docker pull debian:bookworm-slim
scripts/docker/build.sh develop bookworm /bookworm
docker-local-develop-bullseye:
docker pull golang:1-bullseye
scripts/docker/build.sh develop bullseye /bullseye
docker-local-develop-buster:
docker pull golang:1-buster
scripts/docker/build.sh develop buster /buster
docker-local-develop-impish:
docker pull ubuntu:impish
scripts/docker/build.sh develop impish /impish
docker-local-develop-jammy:
docker pull ubuntu:jammy
scripts/docker/build.sh develop jammy /jammy
docker-local-develop-lunar:
docker pull ubuntu:lunar
scripts/docker/build.sh develop lunar /lunar
docker-local-develop-mantic:
docker pull ubuntu:mantic
scripts/docker/build.sh develop mantic /mantic
docker-ddns:
docker pull golang:alpine
scripts/docker/buildx-multi.sh ddns linux/amd64,linux/arm64 $(BUILD_DATE)
docker-goproxy:
docker pull golang:alpine
scripts/docker/buildx-multi.sh goproxy linux/amd64,linux/arm64 $(BUILD_DATE)
demo: docker-demo
docker-demo: docker-demo-latest
docker-demo-all: docker-demo-latest docker-demo-debian
docker-demo-latest:
docker pull photoprism/photoprism:preview-ce
scripts/docker/build.sh demo ce
scripts/docker/push.sh demo ce
docker-demo-debian:
docker pull photoprism/photoprism:preview-ce-debian
scripts/docker/build.sh demo debian /debian
scripts/docker/push.sh demo debian
docker-demo-ubuntu:
docker pull photoprism/photoprism:preview-ce-ubuntu
scripts/docker/build.sh demo ubuntu /ubuntu
scripts/docker/push.sh demo ubuntu
docker-demo-unstable:
docker pull photoprism/photoprism:unstable-ce
scripts/docker/build.sh demo $(BUILD_DATE) /unstable
scripts/docker/push.sh demo $(BUILD_DATE)
docker-demo-local:
scripts/docker/build.sh photoprism
scripts/docker/build.sh demo $(BUILD_DATE) /debian
scripts/docker/push.sh demo $(BUILD_DATE)
docker-dummy-webdav:
docker pull --platform=amd64 golang:1
docker pull --platform=arm64 golang:1
scripts/docker/buildx-multi.sh dummy-webdav linux/amd64,linux/arm64 $(BUILD_DATE)
docker-dummy-oidc:
docker pull --platform=amd64 golang:1
docker pull --platform=arm64 golang:1
scripts/docker/buildx-multi.sh dummy-oidc linux/amd64,linux/arm64 $(BUILD_DATE)
packer-digitalocean:
$(info Buildinng DigitalOcean marketplace image...)
(cd ./setup/docker/cloud && packer build digitalocean.json)
drone-sign:
drone sign photoprism/photoprism --save
clean:
rm -f $(BINARY_NAME)
rm -f *.log
rm -rf node_modules
rm -rf assets/testdata
rm -rf assets/backups
rm -rf frontend/node_modules
docker-development:
scripts/docker-build.sh development $(DOCKER_TAG)
scripts/docker-push.sh development $(DOCKER_TAG)
docker-photoprism:
scripts/docker-build.sh photoprism $(DOCKER_TAG)
scripts/docker-push.sh photoprism $(DOCKER_TAG)
docker-demo:
scripts/docker-build.sh demo $(DOCKER_TAG)
scripts/docker-push.sh demo $(DOCKER_TAG)
docker-tensorflow:
scripts/docker-build.sh tensorflow $(TF_VERSION)
scripts/docker-push.sh tensorflow $(TF_VERSION)
docker-darktable:
scripts/docker-build.sh darktable $(DARKTABLE_VERSION)
scripts/docker-push.sh darktable $(DARKTABLE_VERSION)
docker-tidb:
scripts/docker-build.sh tidb $(TIDB_VERSION)
scripts/docker-push.sh tidb $(TIDB_VERSION)
lint-js:
(cd frontend && npm run lint)
fmt-js:
(cd frontend && npm run fmt)
fmt-go:
go fmt ./pkg/... ./internal/... ./cmd/...
gofmt -w -s pkg internal cmd
goimports -w pkg internal cmd
goimports -w internal cmd
go fmt ./internal/... ./cmd/...
tidy:
go mod tidy -go=1.16 && go mod tidy -go=1.17
users:
./photoprism users add -p photoprism -r admin -s -a test:true -n "Alice Austen" superadmin
./photoprism users ls
# Declare all targets as "PHONY", see https://www.gnu.org/software/make/manual/html_node/Phony-Targets.html.
MAKEFLAGS += --always-make
.PHONY: all assets build cmd docker frontend internal pkg scripts storage photoprism install;
go mod tidy
upgrade-js:
(cd frontend && npm update --depth 1)
upgrade-go:
go mod tidy
go get -u

19914
NOTICE

File diff suppressed because it is too large Load diff

7152
NOTICE.md Normal file

File diff suppressed because it is too large Load diff

148
README.md
View file

@ -1,110 +1,92 @@
PhotoPrism: Browse Your Life in Pictures
PhotoPrism: Browse your life in pictures
========================================
[![License: AGPL](https://img.shields.io/badge/license-AGPL-blue.svg)](https://docs.photoprism.app/license/agpl/)
[![Documentation](https://img.shields.io/badge/read-the%20docs-4aa087.svg)](https://docs.photoprism.app/)
[![Community Chat](https://img.shields.io/badge/chat-on%20gitter-4aa087.svg)](https://link.photoprism.app/chat)
[![GitHub Discussions](https://img.shields.io/badge/ask-%20on%20github-4d6a91.svg)](https://link.photoprism.app/discussions)
[![Bluesky Social](https://dl.photoprism.app/img/badges/badge-follow-photoprism-bsky-social.svg)](https://photoprism.bsky.social/)
[![Mastodon](https://dl.photoprism.app/img/badges/badge-floss-social.svg)](https://floss.social/@photoprism)
[![License: GPL](https://img.shields.io/badge/license-GPL-blue.svg)][license]
[![Code Quality](https://goreportcard.com/badge/github.com/photoprism/photoprism)][goreport]
[![Build Status](https://travis-ci.org/photoprism/photoprism.png?branch=develop)][ci]
[![Documentation](https://readthedocs.org/projects/photoprism-docs/badge/?version=latest&style=flat)][docs]
[![GitHub contributors](https://img.shields.io/github/contributors/photoprism/photoprism.svg)](https://github.com/photoprism/photoprism/graphs/contributors/)
[![Community Chat](https://img.shields.io/badge/chat-on%20gitter-4aa087.svg)][chat]
[![Twitter](https://img.shields.io/badge/follow-@browseyourlife-00acee.svg)][twitter]
PhotoPrism® is an AI-Powered Photos App for the [Decentralized Web](https://en.wikipedia.org/wiki/Decentralized_web).
It makes use of the latest technologies to tag and find pictures automatically without getting in your way.
You can run it at home, on a private server, or in the cloud.
PhotoPrism is a server-based application for browsing, organizing and sharing your personal photo collection.
It makes use of the latest technologies to automatically tag and find pictures without getting in your way.
Say goodbye to solutions that force you to upload your visual memories to the cloud or pay monthly fees.
![](https://dl.photoprism.app/img/ui/search-cards-view.jpg)
![](https://dl.photoprism.org/assets/img/preview.jpg)
To get a first impression, you are welcome to play with our [public demo](https://try.photoprism.app/). Please be careful not to upload any private, unlawful or offensive pictures.
More screenshots: https://photoprism.org/#screenshots
## Feature Overview ##
## What to expect ##
**Our mission is to provide the most user- and privacy-friendly solution to keep your pictures organized and accessible.** That's why PhotoPrism was built from the ground up to run wherever you need it, without compromising freedom, privacy, or functionality:
* Clearly structured Web interface for browsing, organizing and sharing your personal photo collection.
* Import everything without worrying about duplicates or RAW to JPEG conversion.
* Reverse geocoding and automated tagging based on Google TensorFlow.
* No monthly costs. No proprietary formats. No privacy concerns.
* Browse [all your photos](https://docs.photoprism.app/user-guide/organize/browse/) and [videos](https://try.photoprism.app/library/videos) without worrying about [RAW conversion, duplicates or video formats](https://docs.photoprism.app/user-guide/settings/library/)
* Easily find specific pictures using [powerful search filters](https://try.photoprism.app/library/browse?view=cards&q=flower%20color%3Ared)
* Recognizes [the faces of your family and friends](https://try.photoprism.app/library/people)
* [Automatic classification](https://try.photoprism.app/library/labels) of pictures based on their content and location
* [Play Live Photos](https://try.photoprism.app/library/live) by hovering over them in [albums](https://try.photoprism.app/library/albums) and [search results](https://try.photoprism.app/library/browse?view=cards&q=type%3Alive)
* Since the [User Interface](https://try.photoprism.app/) is a [Progressive Web App](https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps),
it provides a native app-like experience, and you can conveniently install it on the home screen of all major operating systems and mobile devices
* Includes four high-resolution [World Maps](https://try.photoprism.app/library/places) to bring back the memories of your favorite trips
* Metadata is extracted and merged from Exif, XMP, and other sources such as Google Photos
* Many more image properties like [Colors](https://try.photoprism.app/library/browse?view=cards&q=color:red), [Chroma](https://try.photoprism.app/library/browse?view=cards&q=mono%3Atrue), and [Quality](https://try.photoprism.app/library/review) can be searched as well
* Use [PhotoSync](https://link.photoprism.app/photosync) to securely backup iOS and Android phones in the background
* WebDAV clients such as Microsoft's Windows Explorer and Apple's Finder [can connect directly](https://docs.photoprism.app/user-guide/sync/webdav/) to PhotoPrism, allowing you to open, edit, and delete files from your computer as if they were local
## For the early birds ##
Being completely [**self-funded and independent**](https://link.photoprism.app/membership), we can promise you that we will [never sell your data](https://www.photoprism.app/privacy) and that we will [always be transparent](https://www.photoprism.app/terms) about our software and services. Your data will never be shared with Google, Amazon, Microsoft or Apple unless you intentionally upload files to one of their services. 🔒
You're welcome to play with our demo at [demo.photoprism.org](https://demo.photoprism.org).
Leave your email to get a [release notification](https://goo.gl/forms/KBPVGl9PCsOKrAv33).
## Getting Started ##
<img align="right" width="25%" src="https://www.photoprism.app/user/pages/01.home/03._screenshots/iphone-maps-hybrid-540px.png">
Step-by-step [installation instructions](https://docs.photoprism.org/en/latest/setup/) can be found
in our [User Guide](https://docs.photoprism.org/en/latest/).
Developers can skip this and move on to the [Developer Guide](https://github.com/photoprism/photoprism/wiki).
Step-by-step [installation instructions](https://docs.photoprism.app/getting-started/) for our self-hosted [community edition](https://link.photoprism.app/personal-editions) can be found on [docs.photoprism.app](https://docs.photoprism.app/getting-started/) - all you need is a Web browser and [Docker](https://docs.docker.com/get-docker/) to run the server. It is available for Mac, Linux, and Windows.
All you need is a Web browser and [Docker](https://store.docker.com/search?type=edition&offering=community)
to run the server. It is available for Mac, Linux and Windows.
Note that we just [started working](https://github.com/photoprism/photoprism/wiki/Project-Status)
on the UI and features are neither complete nor stable.
We plan to ship the final app as a single binary including all dependencies.
The [stable releases](https://docs.photoprism.app/release-notes/) and [development preview](https://docs.photoprism.app/getting-started/updates/#development-preview) are available as a [multi-arch image](https://link.photoprism.app/docker-hub) for 64-bit AMD, Intel, and ARM processors.
That means, [Raspberry Pi](https://docs.photoprism.app/getting-started/raspberry-pi/) and Apple Silicon users enjoy the exact same functionality and can follow the same [installation steps](https://docs.photoprism.app/getting-started/docker-compose/).
If you have a question, don't hesitate to ask in our [help forum](https://groups.google.com/a/photoprism.org/forum/#!forum/help)
or [contact us via email](mailto:hello@photoprism.org).
See our [Getting Started FAQ](https://docs.photoprism.app/getting-started/faq/#how-can-i-install-photoprism-without-docker) for alternative installation methods, for example using the [*tar.gz* packages](https://dl.photoprism.app/pkg/linux/README.html) we provide.
## Why this has to be free software ##
## Support Our Mission 💎 ##
The development of every commercial product is focused on monetization.
We've [built similar apps more than once](https://github.com/photoprism/photoprism/wiki/Mediencenter) and every single time the constraints of working
in a profit-oriented corporate environment were an impediment.
**PhotoPrism is 100% self-funded and independent.** Your [continued support](https://link.photoprism.app/membership) helps us [provide more features to the public](https://www.photoprism.app/oss/faq#what-functionality-is-generally-available), release [regular updates](https://docs.photoprism.app/release-notes/), and remain independent!
We are sure we can do better with only a fraction of the budget. Simplicity - the art of maximizing the amount of work not done - can be very powerful.
Go itself is a [great example](https://talks.golang.org/2015/simplicity-is-complicated.slide).
Our members [enjoy additional features](https://www.photoprism.app/kb/personal), including access to [interactive world maps](https://try.photoprism.app/library/places), and can join our private chat room to [connect with our team](https://www.photoprism.app/about/team). We currently have the following membership options:
Our long-term goal is to become an open platform for machine learning [research](https://github.com/photoprism/photoprism/wiki/Research) based on real-world photo collections.
- You can [sign up directly on our website](https://link.photoprism.app/membership) and pay with credit card or SEPA through Stripe, so you don't need to [link an external account](https://www.photoprism.app/kb/activation) and can easily upgrade or downgrade at any time
- Alternatively, [Patreon](https://link.photoprism.app/patreon) also supports PayPal, additional currencies, and lets you choose between monthly and annual billing for all tiers
## How to contribute ##
If you currently support us through [GitHub Sponsors](https://link.photoprism.app/sponsor), you can also [register on our website](https://my.photoprism.app/register) and use the *Activate GitHub Sponsors Membership* button to link your account. For details on this and how to [link your Patreon account](https://www.patreon.com/pledges), see our [Activation Guide](https://www.photoprism.app/kb/activation).
We welcome contributions of any kind. If you have a bug or an idea, read our
[guide](https://docs.photoprism.org/en/latest/contribute/) before opening an issue.
Issues labeled [help wanted](https://github.com/photoprism/photoprism/labels/help%20wanted) /
[easy](https://github.com/photoprism/photoprism/issues?q=is%3Aissue+is%3Aopen+label%3Aeasy) can be
good (first) contributions.
You are [welcome to contact us](https://www.photoprism.app/contact) for change requests, membership questions, and business partnerships.
You'll get a small reward for working on [funded issues](https://github.com/photoprism/photoprism/labels/funded), see [issuehunt.io](https://issuehunt.io/repos/119160553) for details. Note that issue descriptions may be outdated on their site. Rewards are paid out when all [acceptance criteria](https://github.com/photoprism/photoprism/wiki/Issues#user-stories) prioritized as MUST are met and your [pull request](https://github.com/photoprism/photoprism/wiki/Pull-Requests) was successfully merged.
[View Membership FAQ ](https://www.photoprism.app/kb/membership)[Sign Up ](https://link.photoprism.app/membership)
Please join our [developers mailing list](https://groups.google.com/a/photoprism.org/forum/#!forum/developers)
to receive regular project updates and discuss development related topics. Don't be afraid to ask stupid questions.
### Why Your Support Matters ###
## Donations ##
- Your continued support helps us provide regular updates and remain independent, so we can fulfill our mission and protect your privacy
- Sustained funding is key to quickly releasing new features requested by you and other community members
- Being self-funded and independent, we can personally promise you that we will never sell your data and that we will always be transparent about our software and services
We don't want to ask individuals for a donation at the moment. Please leave a star if you like this project, it provides enough motivation to keep going. Thank you very much! <3
Please also leave [a star](https://github.com/photoprism/photoprism/stargazers) on GitHub if you like this project. It provides additional motivation to keep going.
If you still want to donate, you can do so via [Liberapay][donations] and [PayPal][paypal]. It really means a lot to us as we haven't received any major financial support so far and are funding this project from our personal savings.
**A big thank you to all current and past sponsors, whose generous support has been and continues to be essential to the success of the project!**
## Sponsorship ##
[View Sponsors ](SPONSORS.md)[View Credits ](https://docs.photoprism.app/credits/)
Please [reach out to us](mailto:hello@photoprism.org) if you work for an organization that can [support our project](https://dl.photoprism.org/slides/PhotoPrism.pdf)
as we are looking for a way to continue doing this full-time.
We'll be happy to mention your contribution plus you'll get a direct line to [our team](https://docs.photoprism.org/en/latest/team/) of top-class engineers and scientists.
## Getting Support ##
See [SPONSORS.md](SPONSORS.md) for details.
Visit [docs.photoprism.app/user-guide](https://docs.photoprism.app/user-guide/) to learn how to [sync](https://docs.photoprism.app/user-guide/sync/webdav/), [organize](https://docs.photoprism.app/user-guide/library/), and [share](https://docs.photoprism.app/user-guide/share/) your pictures. If you need help installing our software at home, you are welcome to post your question in [GitHub Discussions](https://link.photoprism.app/discussions) or ask in our [Community Chat](https://link.photoprism.app/chat).
Common problems can be quickly diagnosed and solved using our [Troubleshooting Checklists](https://docs.photoprism.app/getting-started/troubleshooting/). Eligible [members](https://link.photoprism.app/membership) are also welcome to email us for technical support and advice.
## Upcoming Features and Enhancements ##
Our [Project Roadmap](https://link.photoprism.app/roadmap) shows what tasks are in progress and what features will be implemented next. You are invited to give ideas you like a thumbs-up, so we know what's most popular.
Be aware that we have a zero-bug policy and do our best to help users when they need support or have other questions. This comes at a price though, as we can't give exact release dates for new features. Our team receives many more requests than can be implemented, so we want to emphasize that we are in no way obligated to implement the features, enhancements, or other changes you request. We do, however, appreciate your feedback and carefully consider all requests.
**Because sustained funding is key to quickly releasing new features, we encourage you to support our mission by [signing up as a sponsor](https://link.photoprism.app/sponsor) or purchasing a [commercial license](https://www.photoprism.app/teams). Ultimately, that's what's best for the product and the community.**
## GitHub Issues ⚠️ ##
We kindly ask you not to report bugs via GitHub Issues **unless you are certain to have found a fully reproducible and previously unreported issue** that must be fixed directly in the app. Thank you for your careful consideration!
- When reporting a problem, always include the software versions you are using and other information about your environment such as [browser, browser plugins](https://docs.photoprism.app/getting-started/troubleshooting/browsers/), operating system, [storage type](https://docs.photoprism.app/getting-started/troubleshooting/performance/#storage), [memory size](https://docs.photoprism.app/getting-started/troubleshooting/performance/#memory), and [processor](https://docs.photoprism.app/getting-started/troubleshooting/performance/#server-cpu)
- Note that all issue **subscribers receive an email notification** from GitHub whenever a new comment is added, so these should only be used for sharing important information and not for discussions, questions or expressing personal opinions
- [Contact us](https://www.photoprism.app/contact) or [a community member](https://link.photoprism.app/discussions) if you need help, it could be a local configuration problem, or a misunderstanding in how the software works
- This gives our team the opportunity to [improve the docs](https://docs.photoprism.app/getting-started/troubleshooting/) and provide best-in-class support to you, instead of handling unclear/duplicate bug reports or triggering a flood of notifications by responding to comments
## Connect with the Community ##
Follow us on [Twitter](https://link.photoprism.app/twitter) and join the [Community Chat](https://link.photoprism.app/chat)
to get regular updates, connect with other users, and discuss your ideas. Our [Code of Conduct](https://www.photoprism.app/code-of-conduct) explains the "dos and donts" when interacting with other community members.
Feel free to contact us at [hello@photoprism.app](mailto:hello@photoprism.app) with anything that is on your mind. We appreciate your feedback! Due to the high volume of emails we receive, our team may be unable to get back to you immediately. We do our best to respond within five business days or less.
## Every Contribution Makes a Difference ##
We welcome [contributions](CONTRIBUTING.md) of any kind, including blog posts, tutorials, translations, testing, writing documentation, and pull requests. Our [Developer Guide](https://docs.photoprism.app/developer-guide/) contains all the information necessary for you to get started.
----
*PhotoPrism® is a [registered trademark](https://www.photoprism.app/trademark). By using the software and services we provide, you agree to our [Terms of Service](https://www.photoprism.app/terms), [Privacy Policy](https://www.photoprism.app/privacy), and [Code of Conduct](https://www.photoprism.app/code-of-conduct). Docs are [available](https://link.photoprism.app/github-docs) under the [CC BY-NC-SA 4.0 License](https://creativecommons.org/licenses/by-nc-sa/4.0/); [additional terms](https://github.com/photoprism/photoprism/blob/develop/assets/README.md) may apply.*
[license]: https://github.com/photoprism/photoprism/blob/develop/LICENSE
[donations]: https://en.liberapay.com/photoprism
[paypal]: https://www.paypal.me/photoprism
[goreport]: https://goreportcard.com/report/github.com/photoprism/photoprism
[coverage]: https://codecov.io/gh/photoprism/photoprism
[ci]: https://travis-ci.org/photoprism/photoprism
[docs]: https://docs.photoprism.org/en/latest/
[issuehunt]: https://issuehunt.io/repos/119160553
[chat]: https://gitter.im/browseyourlife/community
[twitter]: https://twitter.com/browseyourlife

View file

@ -1,32 +0,0 @@
# PhotoPrism® Security Policy
**Please contact us at [security@photoprism.app](mailto:security@photoprism.app) when you have discovered a potential security issue.** You are welcome to also report vulnerabilities in third-party applications that we may not be able to fix directly.
At a minimum, your report should include the following:
- version and architecture
- vulnerability description
- reproduction steps
We will then try to reproduce the problem, determine the impact and get back to you as soon as possible.
Confirmed vulnerabilities will be fixed within 90 days, depending on the severity and whether third-party
packages are affected.
## Responsible Disclosure
1. Confirm that the vulnerability applies to a current version and is reproducible.
2. First share the vulnerability details with us so that users are not put at risk.
3. Wait before publishing details until everyone has had a chance to update.
4. Respect the privacy of others.
*Avoid activities that disrupt, degrade, or interrupt our services or compromise other users' data, such as spam, brute force attacks, denial of service attacks, and malicious file distribution.*
## Reporting Issues as a Business or Organization
(a) If an email we receive appears to be auto-generated and does not look like a legitimate report that has been manually reviewed in accordance with the requirements of this policy, we may ignore it and you should not expect a response in order to protect our ability to respond to actual issues.
(b) Unless absolutely necessary, for example to report a major issue that has just been discovered, please send requests or reports during regular business hours and never at night or on weekends, especially if they are sent asynchronously.
(c) Refrain from sending HTML emails as we consider them insecure and unsuitable for this purpose.
(d) If you are contacting us as a business or organization, we encourage you to include legal and contact information on your website, as failure to provide legally required information may compromise your eligibility and trustworthiness.

View file

@ -1,97 +1,20 @@
# Thank You to All Current and Past Sponsors 💎 #
Let's join forces
=================
Your [continued support](https://link.photoprism.app/membership) helps us [provide more features to the public](https://www.photoprism.app/oss/faq#what-functionality-is-generally-available), release [regular updates](https://docs.photoprism.app/release-notes/), and remain independent! 💜
PhotoPrism is a non-profit project run entirely by volunteers. We need your funds to pay for
[organizing meetups](https://github.com/photoprism/photoprism/wiki/Meetups),
[running our servers](https://github.com/photoprism/photoprism/wiki/Infrastructure),
visiting conferences, buying test devices, offering rewards for contributions, and covering our cost of living.
You are [welcome to contact us](https://www.photoprism.app/contact) for change requests, membership questions, and business partnerships.
You can [become a sponsor on Patreon](https://www.patreon.com/photoprism) or [Liberapay](https://en.liberapay.com/photoprism), [fund issues](https://issuehunt.io/repos/119160553), [donate via PayPal](https://www.paypal.me/photoprism) or [get in touch with us](mailto:hello@photoprism.org) to discuss further details.
Thank you very much! 💎
[View Membership FAQ ](https://www.photoprism.app/kb/membership)[Contact Us ](https://www.photoprism.app/contact)
## Sponsors ##
## Platinum Sponsors ##
[![Liquid Bytes](https://blog.liquidbytes.net/img/logo-retina.png)](https://blog.liquidbytes.net/)
[**Sid Karunaratne**](https://github.com/sakaru) (Patreon, May 2019)
[Sid Karunaratne](https://github.com/sakaru)
**Andrew** (Patreon, October 2021)
## Donations ##
[**@ppibburr**](https://github.com/ppibburr) (GitHub Sponsors, December 2021)
[**Arto Bendiken**](https://github.com/artob) (GitHub Sponsors, March 2023)
**Marko Eckert** (Patreon, May 2023)
**Vitold Romanovski** (May 2023)
**Aaron C. de Bruyn** (September 2023)
[**Patrick Kvaksrud**](https://github.com/Kvaksrud) (October 2023)
## Gold Sponsors ##
[**Simen Eriksen**](https://github.com/dennorske) (GitHub Sponsors, December 2019)
[**Alex Leahu**](https://github.com/alxjsn) (GitHub Sponsors, January 2020)
[**Thomas Eg**](https://github.com/ThomasEg) (GitHub Sponsors, April 2020)
[**@mpodshivalin**](https://github.com/mpodshivalin) (GitHub Sponsors, July 2020)
[**@kvtong93**](https://github.com/kvtong93) (GitHub Sponsors, September 2020)
[**Thomas Eizinger**](https://github.com/thomaseizinger) (GitHub Sponsors, October 2020)
[**@FreshMosh**](https://github.com/FreshMosh) (GitHub Sponsors, November 2020)
**Cooper** (Patreon, November 2020)
[**Asim Aslam**](https://github.com/asim) (GitHub Sponsors, November 2020)
**Garn Penrod** (Patreon, November 2020)
[**@anaxmedia**](https://github.com/anaxmedia) (GitHub Sponsors, November 2020)
[**Kevin Anderson**](https://github.com/kevinanderson1) (GitHub Sponsors, November 2020)
[**@reyman**](https://github.com/reyman) (GitHub Sponsors, January 2021)
[**Ben McCann**](https://github.com/benmccann) (GitHub Sponsors, January 2021)
[**Steven Chan**](https://github.com/nioq) (GitHub Sponsors, April 2021)
[**Joseph Jacks**](https://github.com/josephjacks) (GitHub Sponsors, June 2021)
[**Daniel Hähnke**](https://github.com/DanBenHa) (GitHub Sponsors, July 2021)
[**@jasontitus**](https://github.com/jasontitus) (GitHub Sponsors, October 2021)
[**Łukasz Anwajler**](https://github.com/anwajler) (GitHub Sponsors, November 2021)
[**Gyto6**](https://github.com/gyto6) (GitHub Sponsors, May 2022)
**Sandro Petruzzi** (Patreon, May 2022)
[**Toly Rugalev**](https://github.com/AnatolyRugalev) (GitHub Sponsors, March 2023)
[**Yongho Lee**](https://github.com/lyh16) (Patreon, May 2023)
**Albert R** (Patreon, August 2023)
**Peter Galbavy** (Patreon, November 2023)
## Infrastructure Sponsors ##
Our project infrastructure is provided by the following companies:
- [**GitHub**](https://github.com/) hosts our [code repositories](https://github.com/photoprism/photoprism) and also provides many other important services
- [**Docker**](https://www.docker.com/) approved us for their [Open Source Program](https://www.docker.com/community/open-source/application/) and hosts all of our app images
- [**Element**](https://element.io/) develops and [operates the infrastructure](https://matrix.org/) that our [community chat](https://link.photoprism.app/chat) is based on
- [**BrowserStack**](https://www.browserstack.com/) provides [free access](https://www.browserstack.com/open-source) to their device and browser testing infrastructure
[View Credits ](https://docs.photoprism.app/credits/)
## One-Time Donations ##
[WarpinWolf](https://github.com/WarpinWolf), [David Pennington](https://github.com/Xeoncross), Jun Li, Jonas Aaberg, Dmitry, Fabian Graf, Klemens
Guder, [Greg](https://github.com/oziee), Jean-Louis Frenkel, [INIT_6](https://twitter.com/init_3), Sandro Rüegge,
William Kray, Ovace Mamnoon, Clément Caplain Moreau, The Gordon Project, [@pluja](https://github.com/pluja),
[@swingstate](https://github.com/photoprism/photoprism/issues/808#issuecomment-997467377), [Sola](https://github.com/solacrypto)
[Make Donation ](https://link.photoprism.app/donate)
[David Pennington](https://github.com/Xeoncross), Jun Li, Jonas Aaberg, Dmitry

View file

@ -1,3 +0,0 @@
examples
README.md
.*

View file

@ -1,149 +0,0 @@
PhotoPrism® Documentation and Digital Assets
This Agreement is between you and PhotoPrism UG ("PhotoPrism", "we" or "us").
Visit photoprism.app/contact to view our full contact information as required
by law.
We may update this Agreement as necessary (1) for legal reasons or (2) to
improve readability and make clarifications that our users request.
By using the Documentation and Digital Assets we provide, you agree to the
terms of this Agreement.
Last Updated: April 5, 2023
DEFINITIONS
"Software" means any software published and distributed by PhotoPrism, either
self-hosted, installed on a device, managed, or as a service.
"Open Source Software" is any software component or software application,
including third-party software, distributed under a Public License.
"Services" means any backend services, world maps, hosted documentation, remote
access, cloud storage, software as a service, support forums, member benefits
and/or other services offered by PhotoPrism that are based on or complementary
to the Software.
"Documentation" means all instructions, diagrams, screenshots, manuals, guides,
references and/or other written documents related to the Software and the
Services.
"Digital Assets" means icons, fonts, illustrations, graphics, background
images, videos, sounds, models, and sample files related to or accompanying the
Software and/or Documentation, such as those provided on GitHub, distributed at
dl.photoprism.app, or used on docs.photoprism.app.
"Brand Assets" means trademarks, logos, icons, fonts, corporate designs,
product and service names, and any other brand features and elements, whether
registered or unregistered.
"Customer" means an individual, company or partnership that has entered into a
written agreement with PhotoPrism to license Software.
"Affiliate(s)" means any entity that controls, is controlled by, or is under
common control with a party, where "control" means the ability to direct the
management and policies of an entity.
"Intellectual Property Rights" means all intellectual property rights,
including but not limited to patents, copyrights, trademarks, goodwill, moral
rights, trade secrets and all other intellectual and industrial property rights
and proprietary rights, including registrations, applications, renewals and
extensions of such rights worldwide.
"License Agreement" means the agreement between PhotoPrism (or a PhotoPrism
Affiliate or an authorized reseller of the Software) and Customer under which
Customer has acquired or will acquire license rights to use the Software.
"Public License" means any license that conforms to the Open Source Definition
(as promulgated by the Open Source Initiative) or the Free Software Definition
(as promulgated by the Free Software Foundation) or a substantially similar
license, including any license approved by the Open Source Initiative or a
Creative Commons license. "Open Source Licenses" include copyleft licenses.
TERMS OF USE
(a) Our public Documentation is available under the terms of the CC BY-NC-SA
4.0 License. Other terms may apply to Digital Assets — in particular
illustrations, graphics, and videos — embedded in the documentation if they
are licensed to us solely for direct distribution. When in doubt, please ask
before distributing or using them for other works.
(b) We hereby grant you a non-exclusive, royalty-free, worldwide,
non-sublicensable, non-transferable right to use the Digital Assets in
combination with the Software and Services, unless otherwise noted.
(c) Because some Digital Assets are licensed to us solely for direct
distribution, we cannot redistribute them under a more permissive license for
other purposes. If the author or copyright holder has not released them under a
permissive license, you must obtain a license before using them in your own
work, whether commercial or non-commercial in nature.
(d) All rights not expressly licensed by PhotoPrism under a License Agreement or
provided under a Public License are reserved. For the avoidance of doubt, this
also applies to promotional materials, legal documents, and any other
Intellectual Property Rights. The use, reproduction, and distribution of Open
Source Software is subject to the terms of the applicable Public License.
TRADEMARK AND BRAND ASSETS
(a) PhotoPrisms Brand Assets are proprietary assets owned exclusively by
PhotoPrism. We reserve the right to object to any use or misuse in any
jurisdiction worldwide. Visit photoprism.app/trademark to learn more.
(b) Contributors, licensees, business partners, and other third parties may
never claim ownership of PhotoPrism's Brand Assets or brands confusingly
similar to PhotoPrism's Brand Assets in any way, including, without limitation,
as a trademark, service mark, company name or designation, domain name, social
media profile/handle, or in any other manner.
(c) You may not include the PhotoPrism trademark in the name of your app,
product, or service, whether commercial or non-commercial in nature. This
includes online services such as e-commerce, community, blog, information,
advertising, and personal home pages, as well as apps, app stores, client apps,
or third-party apps that interact with PhotoPrism.
DISCLAIMER OF WARRANTY
OUR SOFTWARE, SERVICES AND DOCUMENTATION ARE PROVIDED "AS-IS" AND WITHOUT
WARRANTY OF ANY KIND. WE DISCLAIM ALL WARRANTIES, EXPRESSED OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, TITLE,
NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE.
PHOTOPRISM DOES NOT WARRANT THAT THE SOFTWARE, SERVICES OR DOCUMENTATION WILL
BE UNINTERRUPTED OR ERROR-FREE OR THAT ALL ERRORS WILL BE CORRECTED. WE
DISCLAIM ALL LIABILITY AND RESPONSIBILITY FOR ANY THIRD-PARTY PRODUCTS OR
SERVICES OR FOR ANY ACTS OR OMISSIONS OF ANY THIRD-PARTY SUPPLIERS, VENDORS OR
SERVICE PROVIDERS.
LIMITATION OF LIABILITY
TO THE FULLEST EXTENT PERMITTED BY LAW, WE WILL NOT BE LIABLE FOR ANY DAMAGES
ASSOCIATED WITH OUR SOFTWARE, SERVICES OR DOCUMENTATION, INCLUDING WITHOUT
LIMITATION ORDINARY, INCIDENTAL, INDIRECT, OR CONSEQUENTIAL DAMAGES OF ANY
KIND, INCLUDING BUT NOT LIMITED TO DAMAGES RELATING TO LOST DATA OR LOST
PROFITS, EVEN IF WE HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
IN NO EVENT SHALL PHOTOPRISM HAVE ANY LIABILITY TO ANY THIRD-PARTY SUPPLIER,
VENDOR OR SERVICE PROVIDER. NOTWITHSTANDING ANY OTHER PROVISION IN THESE TERMS,
OUR MAXIMUM AGGREGATE LIABILITY IS EUR 50.
FINAL PROVISIONS
(a) These terms do not imply any rights other than those expressly granted in
these terms.
(b) In the event that you breach these terms and we do not take any action, we
will still be entitled to use our rights and remedies in any other situation
where you breach these terms.
(c) If a provision of these terms is or becomes legally invalid or if there is
any gap that needs to be filled, the validity of the remainder of these terms
shall not be affected thereby. Invalid provisions shall be replaced by common
consent with such provisions which come as close as possible to the intended
result of the invalid provision. In the event of gaps, such provisions shall
come into force by common consent which comes as close as possible to the
intended result of these terms, should the matter have been considered in
advance. Any changes of or amendments to these terms must be in writing to
become effective.

3520
assets/config/labels.yml Normal file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,22 @@
debug: false
read-only: false
public: false
admin-password: photoprism
config-path: ~/.config/photoprism
cache-path: ~/.cache/photoprism
assets-path: ~/.local/share/photoprism
resources-path: ~/.local/share/photoprism/resources
originals-path: ~/Pictures/Originals
import-path: ~/Pictures/Import
export-path: ~/Pictures/Export
sql-host: localhost
sql-port: 4000
sql-password: photoprism
http-host:
http-mode: release
http-port: 2342
database-driver: internal
database-dsn: root:photoprism@tcp(localhost:4000)/photoprism?parseTime=true
pid-filename: ~/.local/share/photoprism/photoprism.pid
log-filename: ~/.local/share/photoprism/photoprism.log
detach-server: false

View file

@ -0,0 +1,2 @@
theme: dark
language: en

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

View file

@ -1,3 +0,0 @@
beach*
*.xml
preloader.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

View file

@ -1,9 +0,0 @@
# Sample File Attribution
| Filename | Author | URL |
|-------------------------------|------------|----------------------------------------------------------------------|
| pythagoras.gif | Petrus3743 | <https://commons.wikimedia.org/wiki/File:01-Satz_des_Pythagoras.gif> |
| fox.profile0.8bpc.yuv420.avif | Link-U | <https://github.com/link-u/avif-sample-images> |
**Additional File Samples can be found at <https://dl.photoprism.app/samples/>.**

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 103 KiB

View file

@ -1,70 +0,0 @@
[{
"SourceFile": "beach_sand.jpg",
"ExifToolVersion": 12.56,
"FileName": "beach_sand.jpg",
"Directory": ".",
"FileSize": 105321,
"FileModifyDate": "2023:06:20 04:43:41+00:00",
"FileAccessDate": "2023:08:06 16:38:50+00:00",
"FileInodeChangeDate": "2023:08:04 05:10:37+00:00",
"FilePermissions": 100644,
"FileType": "JPEG",
"FileTypeExtension": "JPG",
"MIMEType": "image/jpeg",
"JFIFVersion": "1 2",
"ExifByteOrder": "MM",
"Make": "Apple",
"Model": "iPhone SE",
"XResolution": 72,
"YResolution": 72,
"ResolutionUnit": 2,
"Software": "10.2.1",
"ModifyDate": "2017:02:15 14:13:40",
"YCbCrPositioning": 1,
"ExposureTime": 0.0004940711462,
"ExposureProgram": 2,
"ISO": 25,
"ExifVersion": "0231",
"DateTimeOriginal": "2017:02:15 14:13:40",
"CreateDate": "2017:02:15 14:13:40",
"ComponentsConfiguration": "1 2 3 0",
"ApertureValue": 2.19999999733148,
"MeteringMode": 5,
"Flash": 16,
"FocalLength": 4.2,
"SubSecTimeOriginal": 249,
"SubSecTimeDigitized": 249,
"FlashpixVersion": "0100",
"ColorSpace": 65535,
"SensingMethod": 2,
"ExposureMode": 0,
"WhiteBalance": 0,
"SceneCaptureType": 0,
"LensModel": "iPhone SE back camera 4.15mm f/2.2",
"GPSVersionID": "2 3 0 0",
"GPSLatitudeRef": "S",
"GPSLongitudeRef": "E",
"GPSAltitudeRef": 1,
"CurrentIPTCDigest": "804bedc723e0e6cd3a41d0a44b074d19",
"DocumentNotes": "https://flickr.com/e/Rl7qi7oH%2BSEGDuwWBbZYaBQMEB5oNfPvQ6m3aMrPQ64%3D",
"ApplicationRecordVersion": 4,
"ImageWidth": 640,
"ImageHeight": 480,
"EncodingProcess": 2,
"BitsPerSample": 8,
"ColorComponents": 3,
"YCbCrSubSampling": "2 2",
"Aperture": 2.19999999733148,
"ImageSize": "640 480",
"Megapixels": 0.3072,
"ShutterSpeed": 0.0004940711462,
"SubSecCreateDate": "2017:02:15 14:13:40.249",
"SubSecDateTimeOriginal": "2017:02:15 14:13:40.249",
"GPSAltitude": -1.990417522,
"GPSLatitude": -29.2824777777778,
"GPSLongitude": 31.4436361111111,
"FocalLength35efl": 4.2,
"GPSPosition": "-29.2824777777778 31.4436361111111",
"LightValue": 15.2580006188259,
"LensID": "iPhone SE back camera 4.15mm f/2.2"
}]

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

View file

@ -1,85 +0,0 @@
[{
"SourceFile": "/Users/michael/Downloads/20200511-141648-Berlin-Germany-2020-3ku.mp4",
"ExifToolVersion": 11.85,
"FileName": "blue-go-video.mp4",
"Directory": "/Users/michael/Downloads",
"FileSize": "4.4 MB",
"FileModifyDate": "2020:05:14 14:02:58+02:00",
"FileAccessDate": "2020:05:14 14:02:58+02:00",
"FileInodeChangeDate": "2020:05:14 14:02:58+02:00",
"FilePermissions": "rw-r--r--",
"FileType": "MP4",
"FileTypeExtension": "mp4",
"MIMEType": "video/mp4",
"MajorBrand": "MP4 v2 [ISO 14496-14]",
"MinorVersion": "0.0.0",
"CompatibleBrands": ["isom","mp42"],
"MovieHeaderVersion": 0,
"CreateDate": "2020:05:11 14:16:48",
"ModifyDate": "2020:05:11 14:16:48",
"TimeScale": 1000,
"Duration": "2.42 s",
"PreferredRate": 1,
"PreferredVolume": "100.00%",
"PreviewTime": "0 s",
"PreviewDuration": "0 s",
"PosterTime": "0 s",
"SelectionTime": "0 s",
"SelectionDuration": "0 s",
"CurrentTime": "0 s",
"NextTrackID": 3,
"GPSCoordinates": "52 deg 27' 34.56\" N, 13 deg 19' 18.48\" E",
"AndroidVersion": 10,
"TrackHeaderVersion": 0,
"TrackCreateDate": "2020:05:11 14:16:48",
"TrackModifyDate": "2020:05:11 14:16:48",
"TrackID": 1,
"TrackDuration": "2.42 s",
"TrackLayer": 0,
"TrackVolume": "0.00%",
"ImageWidth": 1920,
"ImageHeight": 1080,
"GraphicsMode": "srcCopy",
"OpColor": "0 0 0",
"CompressorID": "avc1",
"SourceImageWidth": 1920,
"SourceImageHeight": 1080,
"XResolution": 72,
"YResolution": 72,
"BitDepth": 24,
"PixelAspectRatio": "65536:65536",
"ColorRepresentation": "nclx 1 1 1",
"VideoFrameRate": 28.101,
"MatrixStructure": "1 0 0 0 1 0 0 0 1",
"MediaHeaderVersion": 0,
"MediaCreateDate": "2020:05:11 14:16:48",
"MediaModifyDate": "2020:05:11 14:16:48",
"MediaTimeScale": 48000,
"MediaDuration": "2.41 s",
"HandlerType": "Audio Track",
"HandlerDescription": "SoundHandle",
"Balance": 0,
"AudioFormat": "mp4a",
"AudioChannels": 2,
"AudioBitsPerSample": 16,
"AudioSampleRate": 48000,
"MediaDataSize": 3818513,
"MediaDataOffset": 810340,
"ImageSize": "1920x1080",
"Megapixels": 2.1,
"AvgBitrate": "12.6 Mbps",
"GPSLatitude": "52 deg 27' 34.56\" N",
"GPSLongitude": "13 deg 19' 18.48\" E",
"Rotation": 90,
"GPSPosition": "52 deg 27' 34.56\" N, 13 deg 19' 18.48\" E",
"Title": "Blue Gopher",
"Description": "Cute gopher",
"Comment": "We love go",
"Subject": "gopher",
"Keywords": "blue, desk",
"Artist": "Micha",
"CameraOwner": "Micha",
"CameraSerial": "123",
"DocumentID": "12398365",
"InstanceID": "9058055",
}]

Binary file not shown.

View file

@ -1,6 +0,0 @@
[{
"SourceFile": "/Users/michael/Downloads/20200511-141648-Berlin-Germany-2020-3ku.mp4",
"ExifToolVersion": 11.85,
"FileName": "blue-go-video.mp4",
"Directory": "/Users/michael/Downloads"
}]

Binary file not shown.

Before

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.6 KiB

View file

@ -1,25 +0,0 @@
[{
"SourceFile": "example.gif",
"ExifToolVersion": 12.40,
"FileName": "example.gif",
"Directory": ".",
"FileSize": 5760,
"FileModifyDate": "2021:11:01 14:39:36+00:00",
"FileAccessDate": "2022:04:12 15:49:52+00:00",
"FileInodeChangeDate": "2022:03:02 20:29:31+00:00",
"FilePermissions": 100666,
"FileType": "GIF",
"FileTypeExtension": "GIF",
"MIMEType": "image/gif",
"GIFVersion": "89a",
"ImageWidth": 100,
"ImageHeight": 67,
"HasColorMap": 1,
"ColorResolutionDepth": 8,
"BitsPerPixel": 8,
"BackgroundColor": 0,
"AnimationIterations": 0,
"TransparentColor": 255,
"ImageSize": "100 67",
"Megapixels": 0.0067
}]

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

View file

@ -1,153 +0,0 @@
[{
"SourceFile": "iphone_15_pro.heic",
"ExifToolVersion": 12.40,
"FileName": "iphone_15_pro.heic",
"Directory": ".",
"FileSize": 886825,
"FileModifyDate": "2023:10:31 11:48:48+01:00",
"FileAccessDate": "2023:10:31 11:51:22+01:00",
"FileInodeChangeDate": "2023:10:31 11:50:11+01:00",
"FilePermissions": 100664,
"FileType": "HEIC",
"FileTypeExtension": "HEIC",
"MIMEType": "image/heic",
"MajorBrand": "heic",
"MinorVersion": "0.0.0",
"CompatibleBrands": ["mif1","MiHE","MiPr","miaf","MiHB","heic"],
"HandlerType": "pict",
"PrimaryItemReference": 49,
"MetaImageSize": "0 1287 4032 3024",
"XMPToolkit": "XMP Core 6.0.0",
"HDRGainMapHeadroom": 3.847906,
"HDRGainMapVersion": 131072,
"ExifByteOrder": "MM",
"Make": "Apple",
"Model": "iPhone 15 Pro",
"Orientation": 6,
"XResolution": 72,
"YResolution": 72,
"ResolutionUnit": 2,
"Software": 17.1,
"ModifyDate": "2023:10:31 11:44:43",
"HostComputer": "iPhone 15 Pro",
"ExposureTime": 0.01666666667,
"FNumber": 2.2,
"ExposureProgram": 2,
"ISO": 400,
"ExifVersion": "0232",
"DateTimeOriginal": "2023:10:31 11:44:43",
"CreateDate": "2023:10:31 11:44:43",
"OffsetTime": "+01:00",
"OffsetTimeOriginal": "+01:00",
"OffsetTimeDigitized": "+01:00",
"ShutterSpeedValue": 0.0165679999782223,
"ApertureValue": 2.20000000038133,
"BrightnessValue": 2.15000162,
"ExposureCompensation": 0,
"MeteringMode": 5,
"Flash": 16,
"FocalLength": 2.22,
"SubjectArea": "2015 1511 2323 1330",
"RunTimeFlags": 1,
"RunTimeValue": 154455128730208,
"RunTimeScale": 1000000000,
"RunTimeEpoch": 0,
"AccelerationVector": "-0.004213878416 -1.002046108 -0.01470538881",
"Warning": "[minor] Bad format (16) for MakerNotes entry 10",
"SubSecTimeOriginal": 432,
"SubSecTimeDigitized": 432,
"ColorSpace": 65535,
"ExifImageWidth": 4032,
"ExifImageHeight": 3024,
"SensingMethod": 2,
"SceneType": 1,
"ExposureMode": 0,
"WhiteBalance": 0,
"FocalLengthIn35mmFormat": 14,
"LensInfo": "2.22 9 1.779999971 2.8",
"LensMake": "Apple",
"LensModel": "iPhone 15 Pro back triple camera 2.22mm f/2.2",
"CompositeImage": 2,
"GPSLatitudeRef": "N",
"GPSLongitudeRef": "E",
"GPSAltitudeRef": 0,
"GPSTimeStamp": "10:44:43",
"GPSSpeedRef": "K",
"GPSSpeed": 0,
"GPSImgDirectionRef": "T",
"GPSImgDirection": 101.3112946,
"GPSDestBearingRef": "T",
"GPSDestBearing": 101.3112946,
"GPSDateStamp": "2023:10:31",
"GPSHPositioningError": 14.275587,
"ProfileCMMType": "appl",
"ProfileVersion": 1024,
"ProfileClass": "mntr",
"ColorSpaceData": "RGB ",
"ProfileConnectionSpace": "XYZ ",
"ProfileDateTime": "2022:01:01 00:00:00",
"ProfileFileSignature": "acsp",
"PrimaryPlatform": "APPL",
"CMMFlags": 0,
"DeviceManufacturer": "APPL",
"DeviceModel": "",
"DeviceAttributes": "0 0",
"RenderingIntent": 0,
"ConnectionSpaceIlluminant": "0.9642 1 0.82491",
"ProfileCreator": "appl",
"ProfileID": "236 253 163 142 56 133 71 195 109 180 189 79 122 218 24 47",
"ProfileDescription": "Display P3",
"ProfileCopyright": "Copyright Apple Inc., 2022",
"MediaWhitePoint": "0.96419 1 0.82489",
"RedMatrixColumn": "0.51512 0.2412 -0.00105",
"GreenMatrixColumn": "0.29198 0.69225 0.04189",
"BlueMatrixColumn": "0.1571 0.06657 0.78407",
"RedTRC": "(Binary data 32 bytes, use -b option to extract)",
"ChromaticAdaptation": "1.04788 0.02292 -0.0502 0.02959 0.99048 -0.01706 -0.00923 0.01508 0.75168",
"BlueTRC": "(Binary data 32 bytes, use -b option to extract)",
"GreenTRC": "(Binary data 32 bytes, use -b option to extract)",
"HEVCConfigurationVersion": 1,
"GeneralProfileSpace": 0,
"GeneralTierFlag": 0,
"GeneralProfileIDC": 3,
"GenProfileCompatibilityFlags": 1879048192,
"ConstraintIndicatorFlags": "176 0 0 0 0 0",
"GeneralLevelIDC": 90,
"MinSpatialSegmentationIDC": 0,
"ParallelismType": 0,
"ChromaFormat": 1,
"BitDepthLuma": 8,
"BitDepthChroma": 8,
"AverageFrameRate": 0,
"ConstantFrameRate": 0,
"NumTemporalLayers": 1,
"TemporalIDNested": 0,
"ImageWidth": 4032,
"ImageHeight": 3024,
"ImageSpatialExtent": "4032 3024",
"Rotation": 270,
"ImagePixelDepth": 8,
"AuxiliaryImageType": "urn:com:apple:photo:2020:aux:hdrgainmap",
"MediaDataSize": 882139,
"MediaDataOffset": 4686,
"RunTimeSincePowerUp": 154455.128730208,
"Aperture": 2.2,
"ImageSize": "4032 3024",
"Megapixels": 12.192768,
"ScaleFactor35efl": 6.30630630630631,
"ShutterSpeed": 0.01666666667,
"SubSecCreateDate": "2023:10:31 11:44:43.432+01:00",
"SubSecDateTimeOriginal": "2023:10:31 11:44:43.432+01:00",
"SubSecModifyDate": "2023:10:31 11:44:43+01:00",
"GPSAltitude": 50.15664187,
"GPSDateTime": "2023:10:31 10:44:43Z",
"GPSLatitude": 52.4596055555556,
"GPSLongitude": 13.3218416666667,
"CircleOfConfusion": "0.00476447847114884",
"FOV": 104.250120754113,
"FocalLength35efl": 14,
"GPSPosition": "52.4596055555556 13.3218416666667",
"HyperfocalDistance": 0.470184057236731,
"LightValue": 6.18189764281985,
"LensID": "iPhone 15 Pro back triple camera 2.22mm f/2.2"
}]

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 866 B

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 187 KiB

View file

@ -1,28 +0,0 @@
[{
"SourceFile": "pythagoras.gif",
"ExifToolVersion": 12.40,
"FileName": "pythagoras.gif",
"Directory": ".",
"FileSize": 191371,
"FileModifyDate": "2022:04:13 08:42:33+00:00",
"FileAccessDate": "2022:04:13 10:52:43+00:00",
"FileInodeChangeDate": "2022:04:13 08:42:42+00:00",
"FilePermissions": 100664,
"FileType": "GIF",
"FileTypeExtension": "GIF",
"MIMEType": "image/gif",
"GIFVersion": "89a",
"ImageWidth": 591,
"ImageHeight": 639,
"HasColorMap": 1,
"ColorResolutionDepth": 7,
"BitsPerPixel": 8,
"BackgroundColor": 255,
"AnimationIterations": 0,
"Comment": "Created with GIMP",
"TransparentColor": 255,
"FrameCount": 201,
"Duration": 49.8,
"ImageSize": "591 639",
"Megapixels": 0.377649
}]

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.9 MiB

View file

@ -1,82 +0,0 @@
[{
"SourceFile": "/go/src/github.com/photoprism/photoprism/storage/import/samsung-motion-photo.jpg",
"ExifToolVersion": 12.56,
"FileName": "samsung-motion-photo.jpg",
"Directory": "/go/src/github.com/photoprism/photoprism/storage/import",
"FileSize": 7221645,
"FileModifyDate": "2023:07:27 02:03:13+00:00",
"FileAccessDate": "2023:08:13 17:11:04+00:00",
"FileInodeChangeDate": "2023:08:13 17:11:02+00:00",
"FilePermissions": 100644,
"FileType": "JPEG",
"FileTypeExtension": "JPG",
"MIMEType": "image/jpeg",
"ExifByteOrder": "II",
"Make": "samsung",
"Model": "SM-G973F",
"Orientation": 1,
"XResolution": 72,
"YResolution": 72,
"ResolutionUnit": 2,
"Software": "G973FXXU4CTC9",
"ModifyDate": "2020:04:23 18:33:41",
"YCbCrPositioning": 1,
"ExposureTime": 0.0007575757576,
"FNumber": 2.4,
"ExposureProgram": 2,
"ISO": 50,
"ExifVersion": "0220",
"DateTimeOriginal": "2020:04:23 18:33:41",
"CreateDate": "2020:04:23 18:33:41",
"ShutterSpeedValue": 0.999475026346474,
"ApertureValue": 2.39495740923786,
"BrightnessValue": 22.58,
"ExposureCompensation": 0,
"MaxApertureValue": 2.39495740923786,
"MeteringMode": 2,
"Flash": 0,
"FocalLength": 4.32,
"ColorSpace": 1,
"ExifImageWidth": 4032,
"ExifImageHeight": 3024,
"ExposureMode": 0,
"WhiteBalance": 0,
"DigitalZoomRatio": 1,
"FocalLengthIn35mmFormat": 26,
"SceneCaptureType": 0,
"ImageUniqueID": "L12XLLD01VM",
"GPSLatitudeRef": "N",
"GPSLongitudeRef": "W",
"Compression": 6,
"ThumbnailOffset": 888,
"ThumbnailLength": 50555,
"XMPToolkit": "Adobe XMP Core 5.1.0-jc003",
"MicroVideo": 1,
"MicroVideoVersion": 1,
"MicroVideoOffset": 4535831,
"MicroVideoPresentationTimestampUs": -1,
"ImageWidth": 4032,
"ImageHeight": 3024,
"EncodingProcess": 0,
"BitsPerSample": 8,
"ColorComponents": 3,
"YCbCrSubSampling": "2 2",
"TimeStamp": "2020:04:23 17:33:41.809+00:00",
"MCCData": 234,
"EmbeddedVideoType": "MotionPhoto_Data",
"EmbeddedVideoFile": "(Binary data 4535775 bytes, use -b option to extract)",
"Aperture": 2.4,
"ImageSize": "4032 3024",
"Megapixels": 12.192768,
"ScaleFactor35efl": 6.01851851851852,
"ShutterSpeed": 0.0007575757576,
"ThumbnailImage": "(Binary data 50555 bytes, use -b option to extract)",
"GPSLatitude": 51.5049828,
"GPSLongitude": -0.0787347997222222,
"CircleOfConfusion": "0.00499230176602706",
"FOV": 69.3903656740024,
"FocalLength35efl": 26,
"GPSPosition": "51.5049828 -0.0787347997222222",
"HyperfocalDistance": 1.55759815100044,
"LightValue": 13.8923910258672
}]

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 126 KiB

View file

@ -1,3 +0,0 @@
# Whatever it is, we'd love to hear from you!
Feel free to send an e-mail to

View file

@ -1 +0,0 @@
textexttext

View file

@ -1,6 +0,0 @@
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

View file

@ -1,6 +0,0 @@
version: '3.5'
services:
photoprism:
build: .
image: photoprism/photoprism:develop

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Some files were not shown because too many files have changed in this diff Show more