Index: Don't stack files based on XMP InstanceID

Signed-off-by: Michael Mayer <michael@liquidbytes.net>
This commit is contained in:
Michael Mayer 2020-08-18 00:45:53 +02:00
parent 6c03ad73fd
commit 6e2849fba2
17 changed files with 136 additions and 116 deletions

View file

@ -1,9 +1,17 @@
.PHONY: ;
.SILENT: ; # no need for @
.ONESHELL: ; # recipes execute in same shell
.NOTPARALLEL: ; # wait for target to finish
.EXPORT_ALL_VARIABLES: ; # send all vars to shell
export GO111MODULE=on export GO111MODULE=on
GOIMPORTS=goimports GOIMPORTS=goimports
BINARY_NAME=photoprism BINARY_NAME=photoprism
DOCKER_TAG=`date -u +%Y%m%d` DOCKER_TAG=`date -u +%Y%m%d`
HASRICHGO := $(shell which richgo) HASRICHGO := $(shell which richgo)
ifdef HASRICHGO ifdef HASRICHGO
GOTEST=richgo test GOTEST=richgo test
else else
@ -67,7 +75,7 @@ clean-local-cache:
clean-local-config: clean-local-config:
rm -f ~/.photoprism/storage/settings/* rm -f ~/.photoprism/storage/settings/*
dep-js: dep-js:
(cd frontend && npm install --silent) (cd frontend && npm install --silent && npm audit fix)
dep-go: dep-go:
go build -v ./... go build -v ./...
dep-upgrade: dep-upgrade:

View file

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-07-29 13:42+0000\n" "POT-Creation-Date: 2020-08-17 19:27+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"

View file

@ -128,7 +128,7 @@ services:
photoprism-db: photoprism-db:
image: mariadb:10.5 image: mariadb:10.5
command: mysqld --port=4001 --transaction-isolation=READ-COMMITTED --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --max-connections=1024 --innodb-rollback-on-timeout=OFF --innodb-lock-wait-timeout=50 command: mysqld --port=4001 --transaction-isolation=READ-COMMITTED --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --max-connections=512 --innodb-rollback-on-timeout=OFF --innodb-lock-wait-timeout=50
expose: expose:
- "4001" - "4001"
volumes: volumes:

View file

@ -62,7 +62,7 @@ services:
photoprism-db: photoprism-db:
image: mariadb:10.5 image: mariadb:10.5
command: mysqld --port=4001 --transaction-isolation=READ-COMMITTED --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --max-connections=1024 --innodb-rollback-on-timeout=OFF --innodb-lock-wait-timeout=50 command: mysqld --port=4001 --transaction-isolation=READ-COMMITTED --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --max-connections=512 --innodb-rollback-on-timeout=OFF --innodb-lock-wait-timeout=50
expose: expose:
- "4001" - "4001"
ports: ports:

View file

@ -63,7 +63,7 @@ services:
# photoprism-db: # photoprism-db:
# image: mariadb:10.5 # Alternatively mysql:8.0 # image: mariadb:10.5 # Alternatively mysql:8.0
# restart: unless-stopped # restart: unless-stopped
# command: mysqld --transaction-isolation=READ-COMMITTED --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --max-connections=1024 --innodb-rollback-on-timeout=OFF --innodb-lock-wait-timeout=50 # command: mysqld --transaction-isolation=READ-COMMITTED --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --max-connections=512 --innodb-rollback-on-timeout=OFF --innodb-lock-wait-timeout=50
# volumes: # volumes:
# - "/var/lib/mysql" # - "/var/lib/mysql"
# environment: # environment:

View file

@ -61,7 +61,7 @@ services:
# photoprism-db: # photoprism-db:
# image: mariadb:10.5 # Alternatively mysql:8.0 # image: mariadb:10.5 # Alternatively mysql:8.0
# restart: unless-stopped # restart: unless-stopped
# command: mysqld --transaction-isolation=READ-COMMITTED --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --max-connections=1024 --innodb-rollback-on-timeout=OFF --innodb-lock-wait-timeout=50 # command: mysqld --transaction-isolation=READ-COMMITTED --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --max-connections=512 --innodb-rollback-on-timeout=OFF --innodb-lock-wait-timeout=50
# volumes: # volumes:
# - "/var/lib/mysql" # - "/var/lib/mysql"
# environment: # environment:

View file

@ -2055,9 +2055,9 @@
} }
}, },
"ajv": { "ajv": {
"version": "6.12.3", "version": "6.12.4",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz",
"integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==",
"requires": { "requires": {
"fast-deep-equal": "^3.1.1", "fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0", "fast-json-stable-stringify": "^2.0.0",
@ -5069,9 +5069,9 @@
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
}, },
"eslint": { "eslint": {
"version": "7.6.0", "version": "7.7.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-7.6.0.tgz", "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.7.0.tgz",
"integrity": "sha512-QlAManNtqr7sozWm5TF4wIH9gmUm2hE3vNRUvyoYAa4y1l5/jxD/PQStEjBMQtCqZmSep8UxrcecI60hOpe61w==", "integrity": "sha512-1KUxLzos0ZVsyL81PnRN335nDtQ8/vZUD6uMtWbF+5zDtjKcsklIi78XoE0MVL93QvWTu+E5y44VyyCsOMBrIg==",
"requires": { "requires": {
"@babel/code-frame": "^7.0.0", "@babel/code-frame": "^7.0.0",
"ajv": "^6.10.0", "ajv": "^6.10.0",
@ -8882,9 +8882,9 @@
} }
}, },
"minizlib": { "minizlib": {
"version": "2.1.0", "version": "2.1.2",
"resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.0.tgz", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
"integrity": "sha512-EzTZN/fjSvifSX0SlqUERCN39o6T40AMarPbv0MrarSFtIITCBh7bi+dU8nxGFHuqs9jdIAeoYoKuQAAASsPPA==", "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
"requires": { "requires": {
"minipass": "^3.0.0", "minipass": "^3.0.0",
"yallist": "^4.0.0" "yallist": "^4.0.0"
@ -11082,9 +11082,9 @@
} }
}, },
"pubsub-js": { "pubsub-js": {
"version": "1.8.0", "version": "1.9.0",
"resolved": "https://registry.npmjs.org/pubsub-js/-/pubsub-js-1.8.0.tgz", "resolved": "https://registry.npmjs.org/pubsub-js/-/pubsub-js-1.9.0.tgz",
"integrity": "sha512-z/61CZMA+jaQpBU0QSWkC4w6lX3tPbOdtl1h2UWac4sn6dkWfx7ND75SsN6U0amczdI66PqfuXXD0Ad7tnbaQg==" "integrity": "sha512-bBGaOnAdkn3jhZC71mhjNB4mxQAOM99GTh/NoVuf/VXWUuQAZJGWIkEJlkXi0ACdKx3z65u5qilWaE5G4mMQOw=="
}, },
"pug": { "pug": {
"version": "2.0.4", "version": "2.0.4",
@ -12984,14 +12984,14 @@
"integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA=="
}, },
"tar": { "tar": {
"version": "6.0.2", "version": "6.0.5",
"resolved": "https://registry.npmjs.org/tar/-/tar-6.0.2.tgz", "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.5.tgz",
"integrity": "sha512-Glo3jkRtPcvpDlAs/0+hozav78yoXKFr+c4wgw62NNMO3oo4AaJdCo21Uu7lcwr55h39W2XD1LMERc64wtbItg==", "integrity": "sha512-0b4HOimQHj9nXNEAA7zWwMM91Zhhba3pspja6sQbgTpynOJf+bkjBnfybNYzbpLbnwXnbyB4LOREvlyXLkCHSg==",
"requires": { "requires": {
"chownr": "^2.0.0", "chownr": "^2.0.0",
"fs-minipass": "^2.0.0", "fs-minipass": "^2.0.0",
"minipass": "^3.0.0", "minipass": "^3.0.0",
"minizlib": "^2.1.0", "minizlib": "^2.1.1",
"mkdirp": "^1.0.3", "mkdirp": "^1.0.3",
"yallist": "^4.0.0" "yallist": "^4.0.0"
}, },

View file

@ -28,7 +28,7 @@
"@babel/runtime": "^7.11.2", "@babel/runtime": "^7.11.2",
"@fortawesome/fontawesome-free": "^5.14.0", "@fortawesome/fontawesome-free": "^5.14.0",
"acorn": "^6.4.1", "acorn": "^6.4.1",
"ajv": "^6.12.3", "ajv": "^6.12.4",
"autoprefixer": "^9.8.6", "autoprefixer": "^9.8.6",
"axios": "^0.19.2", "axios": "^0.19.2",
"axios-mock-adapter": "^1.18.2", "axios-mock-adapter": "^1.18.2",
@ -49,7 +49,7 @@
"css-loader": "^2.1.1", "css-loader": "^2.1.1",
"cssnano": "^4.1.10", "cssnano": "^4.1.10",
"easygettext": "^2.14.0", "easygettext": "^2.14.0",
"eslint": "^7.6.0", "eslint": "^7.7.0",
"eslint-config-standard": "^14.1.1", "eslint-config-standard": "^14.1.1",
"eslint-formatter-pretty": "^4.0.0", "eslint-formatter-pretty": "^4.0.0",
"eslint-friendly-formatter": "^4.0.1", "eslint-friendly-formatter": "^4.0.1",
@ -93,7 +93,7 @@
"postcss-preset-env": "^6.7.0", "postcss-preset-env": "^6.7.0",
"postcss-reporter": "^6.0.1", "postcss-reporter": "^6.0.1",
"postcss-url": "^8.0.0", "postcss-url": "^8.0.0",
"pubsub-js": "^1.8.0", "pubsub-js": "^1.9.0",
"puppeteer-core": "^5.2.1", "puppeteer-core": "^5.2.1",
"regenerator-runtime": "^0.13.7", "regenerator-runtime": "^0.13.7",
"resolve-url-loader": "^3.1.1", "resolve-url-loader": "^3.1.1",
@ -104,7 +104,7 @@
"style-loader": "^0.23.1", "style-loader": "^0.23.1",
"sugarss": "^2.0.0", "sugarss": "^2.0.0",
"svg-url-loader": "^5.0.1", "svg-url-loader": "^5.0.1",
"tar": "^6.0.2", "tar": "^6.0.5",
"truncate": "^2.1.0", "truncate": "^2.1.0",
"url-loader": "^1.1.2", "url-loader": "^1.1.2",
"vue": "^2.6.11", "vue": "^2.6.11",

View file

@ -61,13 +61,19 @@
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td title="Unique ID">
<translate>UID</translate> UID
</td> </td>
<td>{{ file.UID | uppercase }}</td> <td>{{ file.UID | uppercase }}</td>
</tr> </tr>
<tr> <tr v-if="file.InstanceID" title="XMP">
<td> <td>
<translate>Instance ID</translate>
</td>
<td>{{ file.InstanceID | uppercase }}</td>
</tr>
<tr>
<td title="SHA-1">
<translate>Hash</translate> <translate>Hash</translate>
</td> </td>
<td>{{ file.Hash }}</td> <td>{{ file.Hash }}</td>

View file

@ -11,7 +11,7 @@ msgid "%{n} albums found"
msgstr "" msgstr ""
#: src/pages/album/photos.vue:362 #: src/pages/album/photos.vue:362
#: src/share/photos.vue:405 #: src/share/photos.vue:410
msgid "%{n} entries found" msgid "%{n} entries found"
msgstr "" msgstr ""
@ -92,7 +92,7 @@ msgstr ""
msgid "Add to album" msgid "Add to album"
msgstr "" msgstr ""
#: src/dialog/photo/files.vue:138 #: src/dialog/photo/files.vue:147
msgid "Added" msgid "Added"
msgstr "" msgstr ""
@ -132,7 +132,7 @@ msgstr ""
msgid "Album" msgid "Album"
msgstr "" msgstr ""
#: src/component/album/toolbar.vue:115 #: src/component/album/toolbar.vue:120
#: src/dialog/photo/album.vue:61 #: src/dialog/photo/album.vue:61
#: src/pages/albums.vue:256 #: src/pages/albums.vue:256
#: src/share/albums.vue:154 #: src/share/albums.vue:154
@ -157,7 +157,7 @@ msgid "All %{n} albums loaded"
msgstr "" msgstr ""
#: src/pages/album/photos.vue:251 #: src/pages/album/photos.vue:251
#: src/share/photos.vue:294 #: src/share/photos.vue:299
msgid "All %{n} entries loaded" msgid "All %{n} entries loaded"
msgstr "" msgstr ""
@ -165,7 +165,7 @@ msgstr ""
msgid "All %{n} labels loaded" msgid "All %{n} labels loaded"
msgstr "" msgstr ""
#: src/component/album/toolbar.vue:79 #: src/component/album/toolbar.vue:84
#: src/component/photo/toolbar.vue:174 #: src/component/photo/toolbar.vue:174
msgid "All Cameras" msgid "All Cameras"
msgstr "" msgstr ""
@ -181,7 +181,7 @@ msgstr ""
msgid "All Colors" msgid "All Colors"
msgstr "" msgstr ""
#: src/component/album/toolbar.vue:83 #: src/component/album/toolbar.vue:88
#: src/component/photo/toolbar.vue:173 #: src/component/photo/toolbar.vue:173
msgid "All Countries" msgid "All Countries"
msgstr "" msgstr ""
@ -276,7 +276,7 @@ msgstr ""
msgid "Artist" msgid "Artist"
msgstr "" msgstr ""
#: src/dialog/photo/files.vue:108 #: src/dialog/photo/files.vue:117
msgid "Aspect Ratio" msgid "Aspect Ratio"
msgstr "" msgstr ""
@ -322,7 +322,7 @@ msgstr ""
msgid "Calendar" msgid "Calendar"
msgstr "" msgstr ""
#: src/component/album/toolbar.vue:120 #: src/component/album/toolbar.vue:125
#: src/component/photo/list.vue:138 #: src/component/photo/list.vue:138
#: src/component/photo/toolbar.vue:201 #: src/component/photo/toolbar.vue:201
#: src/dialog/album/edit.vue:126 #: src/dialog/album/edit.vue:126
@ -337,7 +337,7 @@ msgstr ""
#: src/pages/album/photos.vue:257 #: src/pages/album/photos.vue:257
#: src/pages/photos.vue:292 #: src/pages/photos.vue:292
#: src/share/photos.vue:300 #: src/share/photos.vue:305
msgid "Can't load more, limit reached" msgid "Can't load more, limit reached"
msgstr "" msgstr ""
@ -356,12 +356,12 @@ msgstr ""
msgid "Cancel" msgid "Cancel"
msgstr "" msgstr ""
#: src/component/album/toolbar.vue:94 #: src/component/album/toolbar.vue:99
#: src/component/photo/toolbar.vue:184 #: src/component/photo/toolbar.vue:184
msgid "Cards" msgid "Cards"
msgstr "" msgstr ""
#: src/component/album/toolbar.vue:122 #: src/component/album/toolbar.vue:127
#: src/component/photo/toolbar.vue:206 #: src/component/photo/toolbar.vue:206
#: src/dialog/album/edit.vue:128 #: src/dialog/album/edit.vue:128
#: src/dialog/photo/details.vue:445 #: src/dialog/photo/details.vue:445
@ -391,7 +391,7 @@ msgstr ""
msgid "Chinese" msgid "Chinese"
msgstr "" msgstr ""
#: src/dialog/photo/files.vue:120 #: src/dialog/photo/files.vue:129
msgid "Chroma" msgid "Chroma"
msgstr "" msgstr ""
@ -401,7 +401,7 @@ msgstr ""
msgid "Close" msgid "Close"
msgstr "" msgstr ""
#: src/dialog/photo/files.vue:84 #: src/dialog/photo/files.vue:93
msgid "Codec" msgid "Codec"
msgstr "" msgstr ""
@ -490,7 +490,7 @@ msgstr ""
msgid "Couldn't find recently edited" msgid "Couldn't find recently edited"
msgstr "" msgstr ""
#: src/component/album/toolbar.vue:119 #: src/component/album/toolbar.vue:124
#: src/component/photo/toolbar.vue:200 #: src/component/photo/toolbar.vue:200
#: src/dialog/album/edit.vue:125 #: src/dialog/album/edit.vue:125
#: src/dialog/photo/details.vue:440 #: src/dialog/photo/details.vue:440
@ -547,7 +547,7 @@ msgstr ""
msgid "Delete" msgid "Delete"
msgstr "" msgstr ""
#: src/component/album/toolbar.vue:116 #: src/component/album/toolbar.vue:121
#: src/dialog/album/edit.vue:122 #: src/dialog/album/edit.vue:122
#: src/dialog/photo/details.vue:462 #: src/dialog/photo/details.vue:462
msgid "Description" msgid "Description"
@ -561,7 +561,7 @@ msgstr ""
msgid "Details" msgid "Details"
msgstr "" msgstr ""
#: src/dialog/photo/files.vue:205 #: src/dialog/photo/files.vue:215
msgid "Dimensions" msgid "Dimensions"
msgstr "" msgstr ""
@ -589,12 +589,15 @@ msgid "Done."
msgstr "" msgstr ""
#: src/component/album/clipboard.vue:115 #: src/component/album/clipboard.vue:115
#: src/component/album/toolbar.vue:89
#: src/component/file/clipboard.vue:78 #: src/component/file/clipboard.vue:78
#: src/component/label/clipboard.vue:91 #: src/component/label/clipboard.vue:91
#: src/component/photo/clipboard.vue:157 #: src/component/photo/clipboard.vue:157
#: src/dialog/photo/files.vue:33
#: src/pages/settings/general.vue:351 #: src/pages/settings/general.vue:351
#: src/share/album/clipboard.vue:70 #: src/share/album/clipboard.vue:70
#: src/share/photo/clipboard.vue:76 #: src/share/photo/clipboard.vue:76
#: src/share/photos.vue:68
msgid "Download" msgid "Download"
msgstr "" msgstr ""
@ -607,12 +610,14 @@ msgid "Download single files and zip archives."
msgstr "" msgstr ""
#: src/component/album/clipboard.vue:181 #: src/component/album/clipboard.vue:181
#: src/component/album/toolbar.vue:174
#: src/component/file/clipboard.vue:106 #: src/component/file/clipboard.vue:106
#: src/component/label/clipboard.vue:132 #: src/component/label/clipboard.vue:132
#: src/component/photo/clipboard.vue:223 #: src/component/photo/clipboard.vue:223
#: src/component/photo/viewer.vue:163 #: src/component/photo/viewer.vue:163
#: src/share/album/clipboard.vue:93 #: src/share/album/clipboard.vue:93
#: src/share/photo/clipboard.vue:97 #: src/share/photo/clipboard.vue:97
#: src/share/photos.vue:531
msgid "Downloading…" msgid "Downloading…"
msgstr "" msgstr ""
@ -656,7 +661,7 @@ msgstr ""
msgid "English" msgid "English"
msgstr "" msgstr ""
#: src/dialog/photo/files.vue:126 #: src/dialog/photo/files.vue:135
msgid "Error" msgid "Error"
msgstr "" msgstr ""
@ -792,13 +797,13 @@ msgstr ""
msgid "Grey" msgid "Grey"
msgstr "" msgstr ""
#: src/component/album/toolbar.vue:105 #: src/component/album/toolbar.vue:110
#: src/component/photo/toolbar.vue:193 #: src/component/photo/toolbar.vue:193
#: src/dialog/album/edit.vue:115 #: src/dialog/album/edit.vue:115
msgid "Group by similarity" msgid "Group by similarity"
msgstr "" msgstr ""
#: src/dialog/photo/files.vue:48 #: src/dialog/photo/files.vue:57
msgid "Hash" msgid "Hash"
msgstr "" msgstr ""
@ -868,8 +873,8 @@ msgstr ""
msgid "Importing files to originals…" msgid "Importing files to originals…"
msgstr "" msgstr ""
#: src/dialog/photo/files.vue:140 #: src/dialog/photo/files.vue:149
#: src/dialog/photo/files.vue:146 #: src/dialog/photo/files.vue:155
msgid "in" msgid "in"
msgstr "" msgstr ""
@ -889,6 +894,10 @@ msgstr ""
msgid "Indexing media and sidecar files…" msgid "Indexing media and sidecar files…"
msgstr "" msgstr ""
#: src/dialog/photo/files.vue:51
msgid "Instance ID"
msgstr ""
#: src/dialog/account/edit.vue:362 #: src/dialog/account/edit.vue:362
msgid "Interval" msgid "Interval"
msgstr "" msgstr ""
@ -986,7 +995,7 @@ msgstr ""
msgid "Link" msgid "Link"
msgstr "" msgstr ""
#: src/component/album/toolbar.vue:95 #: src/component/album/toolbar.vue:100
#: src/component/photo/toolbar.vue:185 #: src/component/photo/toolbar.vue:185
msgid "List" msgid "List"
msgstr "" msgstr ""
@ -1035,7 +1044,7 @@ msgstr ""
msgid "Magenta" msgid "Magenta"
msgstr "" msgstr ""
#: src/dialog/photo/files.vue:114 #: src/dialog/photo/files.vue:123
msgid "Main Color" msgid "Main Color"
msgstr "" msgstr ""
@ -1051,7 +1060,7 @@ msgstr ""
msgid "Medium" msgid "Medium"
msgstr "" msgstr ""
#: src/dialog/photo/files.vue:132 #: src/dialog/photo/files.vue:141
msgid "Missing" msgid "Missing"
msgstr "" msgstr ""
@ -1086,7 +1095,7 @@ msgid "More than 20 labels found"
msgstr "" msgstr ""
#: src/pages/album/photos.vue:365 #: src/pages/album/photos.vue:365
#: src/share/photos.vue:408 #: src/share/photos.vue:413
msgid "More than 50 entries found" msgid "More than 50 entries found"
msgstr "" msgstr ""
@ -1094,12 +1103,12 @@ msgstr ""
msgid "More than 50 results" msgid "More than 50 results"
msgstr "" msgstr ""
#: src/component/album/toolbar.vue:93 #: src/component/album/toolbar.vue:98
#: src/component/photo/toolbar.vue:183 #: src/component/photo/toolbar.vue:183
msgid "Mosaic" msgid "Mosaic"
msgstr "" msgstr ""
#: src/component/album/toolbar.vue:106 #: src/component/album/toolbar.vue:111
#: src/component/photo/toolbar.vue:194 #: src/component/photo/toolbar.vue:194
#: src/dialog/album/edit.vue:116 #: src/dialog/album/edit.vue:116
msgid "Most relevant" msgid "Most relevant"
@ -1126,15 +1135,15 @@ msgstr[1] ""
#: src/component/photo/list.vue:140 #: src/component/photo/list.vue:140
#: src/dialog/account/edit.vue:488 #: src/dialog/account/edit.vue:488
#: src/dialog/album/edit.vue:121 #: src/dialog/album/edit.vue:121
#: src/dialog/photo/files.vue:60 #: src/dialog/photo/files.vue:69
#: src/dialog/photo/files.vue:204 #: src/dialog/photo/files.vue:214
#: src/dialog/photo/info.vue:30 #: src/dialog/photo/info.vue:30
#: src/pages/login.vue:72 #: src/pages/login.vue:72
#: src/share/photo/list.vue:117 #: src/share/photo/list.vue:117
msgid "Name" msgid "Name"
msgstr "" msgstr ""
#: src/component/album/toolbar.vue:124 #: src/component/album/toolbar.vue:129
#: src/dialog/album/edit.vue:119 #: src/dialog/album/edit.vue:119
#: src/dialog/photo/labels.vue:117 #: src/dialog/photo/labels.vue:117
#: src/pages/labels.vue:199 #: src/pages/labels.vue:199
@ -1152,7 +1161,7 @@ msgstr ""
msgid "New Password" msgid "New Password"
msgstr "" msgstr ""
#: src/component/album/toolbar.vue:102 #: src/component/album/toolbar.vue:107
#: src/component/photo/toolbar.vue:190 #: src/component/photo/toolbar.vue:190
#: src/dialog/album/edit.vue:112 #: src/dialog/album/edit.vue:112
msgid "Newest first" msgid "Newest first"
@ -1172,7 +1181,7 @@ msgid "No albums found"
msgstr "" msgstr ""
#: src/pages/album/photos.vue:358 #: src/pages/album/photos.vue:358
#: src/share/photos.vue:401 #: src/share/photos.vue:406
msgid "No entries found" msgid "No entries found"
msgstr "" msgstr ""
@ -1250,7 +1259,7 @@ msgstr ""
msgid "Offline" msgid "Offline"
msgstr "" msgstr ""
#: src/component/album/toolbar.vue:103 #: src/component/album/toolbar.vue:108
#: src/component/photo/toolbar.vue:191 #: src/component/photo/toolbar.vue:191
#: src/dialog/album/edit.vue:113 #: src/dialog/album/edit.vue:113
msgid "Oldest first" msgid "Oldest first"
@ -1266,7 +1275,7 @@ msgid "One album found"
msgstr "" msgstr ""
#: src/pages/album/photos.vue:360 #: src/pages/album/photos.vue:360
#: src/share/photos.vue:403 #: src/share/photos.vue:408
msgid "One entry found" msgid "One entry found"
msgstr "" msgstr ""
@ -1298,7 +1307,7 @@ msgstr ""
msgid "Original file names will be stored and indexed." msgid "Original file names will be stored and indexed."
msgstr "" msgstr ""
#: src/dialog/photo/files.vue:66 #: src/dialog/photo/files.vue:75
#: src/dialog/photo/info.vue:36 #: src/dialog/photo/info.vue:36
msgid "Original Name" msgid "Original Name"
msgstr "" msgstr ""
@ -1392,7 +1401,7 @@ msgstr ""
msgid "Polish" msgid "Polish"
msgstr "" msgstr ""
#: src/dialog/photo/files.vue:96 #: src/dialog/photo/files.vue:105
msgid "Portrait" msgid "Portrait"
msgstr "" msgstr ""
@ -1417,9 +1426,9 @@ msgstr ""
msgid "Preview" msgid "Preview"
msgstr "" msgstr ""
#: src/dialog/photo/files.vue:33 #: src/dialog/photo/files.vue:36
#: src/dialog/photo/files.vue:90 #: src/dialog/photo/files.vue:99
#: src/dialog/photo/files.vue:198 #: src/dialog/photo/files.vue:208
msgid "Primary" msgid "Primary"
msgstr "" msgstr ""
@ -1429,7 +1438,7 @@ msgstr ""
msgid "Private" msgid "Private"
msgstr "" msgstr ""
#: src/dialog/photo/files.vue:102 #: src/dialog/photo/files.vue:111
msgid "Projection" msgid "Projection"
msgstr "" msgstr ""
@ -1461,13 +1470,13 @@ msgstr ""
msgid "Re-index all originals, including already indexed and unchanged files." msgid "Re-index all originals, including already indexed and unchanged files."
msgstr "" msgstr ""
#: src/component/album/toolbar.vue:100 #: src/component/album/toolbar.vue:105
#: src/component/photo/toolbar.vue:188 #: src/component/photo/toolbar.vue:188
#: src/dialog/album/edit.vue:110 #: src/dialog/album/edit.vue:110
msgid "Recently added" msgid "Recently added"
msgstr "" msgstr ""
#: src/component/album/toolbar.vue:101 #: src/component/album/toolbar.vue:106
#: src/component/photo/toolbar.vue:189 #: src/component/photo/toolbar.vue:189
#: src/dialog/album/edit.vue:111 #: src/dialog/album/edit.vue:111
msgid "Recently edited" msgid "Recently edited"
@ -1545,7 +1554,7 @@ msgstr ""
msgid "Scans" msgid "Scans"
msgstr "" msgstr ""
#: src/component/album/toolbar.vue:117 #: src/component/album/toolbar.vue:122
#: src/component/photo/toolbar.vue:198 #: src/component/photo/toolbar.vue:198
#: src/component/photo/toolbar.vue:33 #: src/component/photo/toolbar.vue:33
#: src/dialog/album/edit.vue:123 #: src/dialog/album/edit.vue:123
@ -1573,7 +1582,7 @@ msgstr ""
#: src/pages/photos.vue:314 #: src/pages/photos.vue:314
#: src/pages/places.vue:209 #: src/pages/places.vue:209
#: src/share/albums.vue:280 #: src/share/albums.vue:280
#: src/share/photos.vue:322 #: src/share/photos.vue:327
msgid "Search term too short" msgid "Search term too short"
msgstr "" msgstr ""
@ -1670,8 +1679,8 @@ msgid "Similar"
msgstr "" msgstr ""
#: src/dialog/account/edit.vue:261 #: src/dialog/account/edit.vue:261
#: src/dialog/photo/files.vue:72 #: src/dialog/photo/files.vue:81
#: src/dialog/photo/files.vue:206 #: src/dialog/photo/files.vue:216
msgid "Size" msgid "Size"
msgstr "" msgstr ""
@ -1679,13 +1688,13 @@ msgstr ""
msgid "Slow" msgid "Slow"
msgstr "" msgstr ""
#: src/component/album/toolbar.vue:104 #: src/component/album/toolbar.vue:109
#: src/component/photo/toolbar.vue:192 #: src/component/photo/toolbar.vue:192
#: src/dialog/album/edit.vue:114 #: src/dialog/album/edit.vue:114
msgid "Sort by file name" msgid "Sort by file name"
msgstr "" msgstr ""
#: src/component/album/toolbar.vue:121 #: src/component/album/toolbar.vue:126
#: src/component/photo/toolbar.vue:207 #: src/component/photo/toolbar.vue:207
#: src/dialog/album/edit.vue:127 #: src/dialog/album/edit.vue:127
#: src/dialog/photo/details.vue:446 #: src/dialog/photo/details.vue:446
@ -1716,11 +1725,11 @@ msgstr ""
msgid "States" msgid "States"
msgstr "" msgstr ""
#: src/dialog/photo/files.vue:208 #: src/dialog/photo/files.vue:218
msgid "Status" msgid "Status"
msgstr "" msgstr ""
#: src/dialog/photo/files.vue:54 #: src/dialog/photo/files.vue:63
msgid "Storage Folder" msgid "Storage Folder"
msgstr "" msgstr ""
@ -1842,16 +1851,12 @@ msgid "Try again using other filters or keywords."
msgstr "" msgstr ""
#: src/dialog/account/edit.vue:620 #: src/dialog/account/edit.vue:620
#: src/dialog/photo/files.vue:78 #: src/dialog/photo/files.vue:87
#: src/dialog/photo/files.vue:207 #: src/dialog/photo/files.vue:217
#: src/dialog/photo/info.vue:15 #: src/dialog/photo/info.vue:15
msgid "Type" msgid "Type"
msgstr "" msgstr ""
#: src/dialog/photo/files.vue:42
msgid "UID"
msgstr ""
#: src/dialog/photo/details.vue:432 #: src/dialog/photo/details.vue:432
#: src/dialog/photo/info.vue:254 #: src/dialog/photo/info.vue:254
#: src/model/album.js:122 #: src/model/album.js:122
@ -1877,11 +1882,11 @@ msgstr ""
msgid "Unsorted" msgid "Unsorted"
msgstr "" msgstr ""
#: src/dialog/photo/files.vue:36 #: src/dialog/photo/files.vue:39
msgid "Unstack" msgid "Unstack"
msgstr "" msgstr ""
#: src/dialog/photo/files.vue:144 #: src/dialog/photo/files.vue:153
#: src/dialog/photo/info.vue:157 #: src/dialog/photo/info.vue:157
msgid "Updated" msgid "Updated"
msgstr "" msgstr ""
@ -1959,7 +1964,7 @@ msgstr ""
msgid "Videos" msgid "Videos"
msgstr "" msgstr ""
#: src/component/album/toolbar.vue:118 #: src/component/album/toolbar.vue:123
#: src/component/photo/toolbar.vue:199 #: src/component/photo/toolbar.vue:199
#: src/dialog/album/edit.vue:124 #: src/dialog/album/edit.vue:124
#: src/dialog/photo/details.vue:439 #: src/dialog/photo/details.vue:439
@ -2002,9 +2007,9 @@ msgid "Yellow"
msgstr "" msgstr ""
#: src/dialog/photo/archive.vue:15 #: src/dialog/photo/archive.vue:15
#: src/dialog/photo/files.vue:92 #: src/dialog/photo/files.vue:101
#: src/dialog/photo/files.vue:98 #: src/dialog/photo/files.vue:107
#: src/dialog/photo/files.vue:134 #: src/dialog/photo/files.vue:143
#: src/dialog/photo/info.vue:191 #: src/dialog/photo/info.vue:191
#: src/dialog/photo/info.vue:218 #: src/dialog/photo/info.vue:218
#: src/dialog/photo/info.vue:245 #: src/dialog/photo/info.vue:245

View file

@ -38,9 +38,9 @@ import {$gettext} from "common/vm";
export class File extends RestModel { export class File extends RestModel {
getDefaults() { getDefaults() {
return { return {
InstanceID: "",
UID: "", UID: "",
PhotoUID: "", PhotoUID: "",
InstanceID: "",
Root: "/", Root: "/",
Name: "", Name: "",
OriginalName: "", OriginalName: "",

View file

@ -49,8 +49,8 @@ export const DayUnknown = -1;
export class Photo extends RestModel { export class Photo extends RestModel {
getDefaults() { getDefaults() {
return { return {
DocumentID: "",
UID: "", UID: "",
DocumentID: "",
Type: TypeImage, Type: TypeImage,
TypeSrc: "", TypeSrc: "",
Favorite: false, Favorite: false,

View file

@ -17,10 +17,10 @@ type Files []File
// File represents an image or sidecar file that belongs to a photo. // File represents an image or sidecar file that belongs to a photo.
type File struct { type File struct {
ID uint `gorm:"primary_key" json:"-" yaml:"-"` ID uint `gorm:"primary_key" json:"-" yaml:"-"`
UUID string `gorm:"type:varbinary(42);index;" json:"InstanceID,omitempty" yaml:"InstanceID,omitempty"`
Photo *Photo `json:"-" yaml:"-"` Photo *Photo `json:"-" yaml:"-"`
PhotoID uint `gorm:"index;" json:"-" yaml:"-"` PhotoID uint `gorm:"index;" json:"-" yaml:"-"`
PhotoUID string `gorm:"type:varbinary(42);index;" json:"PhotoUID" yaml:"PhotoUID"` PhotoUID string `gorm:"type:varbinary(42);index;" json:"PhotoUID" yaml:"PhotoUID"`
InstanceID string `gorm:"type:varbinary(42);index;" json:"InstanceID,omitempty" yaml:"InstanceID,omitempty"`
FileUID string `gorm:"type:varbinary(42);unique_index;" json:"UID" yaml:"UID"` FileUID string `gorm:"type:varbinary(42);unique_index;" json:"UID" yaml:"UID"`
FileName string `gorm:"type:varbinary(768);unique_index:idx_files_name_root;" json:"Name" yaml:"Name"` FileName string `gorm:"type:varbinary(768);unique_index:idx_files_name_root;" json:"Name" yaml:"Name"`
FileRoot string `gorm:"type:varbinary(16);default:'/';unique_index:idx_files_name_root;" json:"Root" yaml:"Root,omitempty"` FileRoot string `gorm:"type:varbinary(16);default:'/';unique_index:idx_files_name_root;" json:"Root" yaml:"Root,omitempty"`

View file

@ -131,11 +131,6 @@ func (ind *Index) MediaFile(m *MediaFile, o IndexOptions, originalName string) (
result.Status = IndexDuplicate result.Status = IndexDuplicate
return result return result
} }
if !fileExists && m.MetaData().HasInstanceID() {
fileQuery = entity.UnscopedDb().First(&file, "uuid = ?", m.MetaData().InstanceID)
fileExists = fileQuery.Error == nil
}
} }
if !fileExists { if !fileExists {
@ -255,7 +250,14 @@ func (ind *Index) MediaFile(m *MediaFile, o IndexOptions, originalName string) (
} }
if metaData := m.MetaData(); metaData.Error == nil { if metaData := m.MetaData(); metaData.Error == nil {
file.FileCodec = metaData.Codec
file.FileProjection = metaData.Projection file.FileProjection = metaData.Projection
if metaData.HasInstanceID() {
log.Infof("index: %s has instance_id %s", logName, txt.Quote(metaData.InstanceID))
file.InstanceID = metaData.InstanceID
}
} }
case m.IsXMP(): case m.IsXMP():
// TODO: Proof-of-concept for indexing XMP sidecar files // TODO: Proof-of-concept for indexing XMP sidecar files
@ -309,15 +311,15 @@ func (ind *Index) MediaFile(m *MediaFile, o IndexOptions, originalName string) (
} }
if metaData.HasDocumentID() && photo.UUID == "" { if metaData.HasDocumentID() && photo.UUID == "" {
log.Debugf("index: %s has document id %s", logName, txt.Quote(metaData.DocumentID)) log.Infof("index: %s has document_id %s", logName, txt.Quote(metaData.DocumentID))
photo.UUID = metaData.DocumentID photo.UUID = metaData.DocumentID
} }
if metaData.HasInstanceID() && file.UUID == "" { if metaData.HasInstanceID() {
log.Debugf("index: %s has instance id %s", logName, txt.Quote(metaData.InstanceID)) log.Infof("index: %s has instance_id %s", logName, txt.Quote(metaData.InstanceID))
file.UUID = metaData.InstanceID file.InstanceID = metaData.InstanceID
} }
file.FileCodec = metaData.Codec file.FileCodec = metaData.Codec
@ -398,15 +400,15 @@ func (ind *Index) MediaFile(m *MediaFile, o IndexOptions, originalName string) (
} }
if metaData.HasDocumentID() && photo.UUID == "" { if metaData.HasDocumentID() && photo.UUID == "" {
log.Debugf("index: %s has document id %s", logName, txt.Quote(metaData.DocumentID)) log.Infof("index: %s has document_id %s", logName, txt.Quote(metaData.DocumentID))
photo.UUID = metaData.DocumentID photo.UUID = metaData.DocumentID
} }
if metaData.HasInstanceID() && file.UUID == "" { if metaData.HasInstanceID() {
log.Debugf("index: %s has instance id %s", logName, txt.Quote(metaData.InstanceID)) log.Infof("index: %s has instance_id %s", logName, txt.Quote(metaData.InstanceID))
file.UUID = metaData.InstanceID file.InstanceID = metaData.InstanceID
} }
file.FileCodec = metaData.Codec file.FileCodec = metaData.Codec
@ -496,16 +498,10 @@ func (ind *Index) MediaFile(m *MediaFile, o IndexOptions, originalName string) (
} }
if metaData.HasDocumentID() && photo.UUID == "" { if metaData.HasDocumentID() && photo.UUID == "" {
log.Debugf("index: %s has document id %s", logName, txt.Quote(metaData.DocumentID)) log.Debugf("index: %s has document_id %s", logName, txt.Quote(metaData.DocumentID))
photo.UUID = metaData.DocumentID photo.UUID = metaData.DocumentID
} }
if metaData.HasInstanceID() && file.UUID == "" {
log.Debugf("index: %s has instance id %s", logName, txt.Quote(metaData.InstanceID))
file.UUID = metaData.InstanceID
}
} }
if photo.CameraSrc == entity.SrcAuto { if photo.CameraSrc == entity.SrcAuto {
@ -626,11 +622,11 @@ func (ind *Index) MediaFile(m *MediaFile, o IndexOptions, originalName string) (
w := txt.Keywords(details.Keywords) w := txt.Keywords(details.Keywords)
if !fs.IsGenerated(fileBase) { if !fs.IsGenerated(fileBase) {
w = append(w, txt.FilenameKeywords(filePath)...)
w = append(w, txt.FilenameKeywords(fileBase)...) w = append(w, txt.FilenameKeywords(fileBase)...)
} }
w = append(w, locKeywords...) w = append(w, locKeywords...)
w = append(w, txt.FilenameKeywords(filePath)...)
w = append(w, txt.FilenameKeywords(file.OriginalName)...) w = append(w, txt.FilenameKeywords(file.OriginalName)...)
w = append(w, file.FileMainColor) w = append(w, file.FileMainColor)
w = append(w, labels.Keywords()...) w = append(w, labels.Keywords()...)

View file

@ -60,6 +60,7 @@ type PhotoResult struct {
PlaceCity string `json:"PlaceCity"` PlaceCity string `json:"PlaceCity"`
PlaceState string `json:"PlaceState"` PlaceState string `json:"PlaceState"`
PlaceCountry string `json:"PlaceCountry"` PlaceCountry string `json:"PlaceCountry"`
InstanceID string `json:"InstanceID"`
FileID uint `json:"-"` // File FileID uint `json:"-"` // File
FileUID string `json:"FileUID"` FileUID string `json:"FileUID"`
FileRoot string `json:"FileRoot"` FileRoot string `json:"FileRoot"`

View file

@ -26,7 +26,7 @@ func PhotoSearch(f form.PhotoSearch) (results PhotoResults, count int, err error
// Main search query, avoids (slow) left joins. // Main search query, avoids (slow) left joins.
s = s.Table("photos"). s = s.Table("photos").
Select(`photos.*, Select(`photos.*,
files.id AS file_id, files.file_uid, files.file_primary, files.file_missing, files.file_name, files.id AS file_id, files.file_uid, files.instance_id, files.file_primary, files.file_missing, files.file_name,
files.file_root, files.file_hash, files.file_codec, files.file_type, files.file_mime, files.file_width, files.file_root, files.file_hash, files.file_codec, files.file_type, files.file_mime, files.file_width,
files.file_height, files.file_aspect_ratio, files.file_orientation, files.file_main_color, files.file_height, files.file_aspect_ratio, files.file_orientation, files.file_main_color,
files.file_colors, files.file_luminance, files.file_chroma, files.file_projection, files.file_colors, files.file_luminance, files.file_chroma, files.file_projection,

View file

@ -126,6 +126,10 @@ func TestBase(t *testing.T) {
result := BasePrefix("20180506_091537_DSC02122(-2.7).JPG", true) result := BasePrefix("20180506_091537_DSC02122(-2.7).JPG", true)
assert.Equal(t, "20180506_091537_DSC02122", result) assert.Equal(t, "20180506_091537_DSC02122", result)
}) })
t.Run("1996 001.jpg", func(t *testing.T) {
result := BasePrefix("1996 001.jpg", true)
assert.Equal(t, "1996 001", result)
})
} }
func TestRelBase(t *testing.T) { func TestRelBase(t *testing.T) {