Use int64 for file modification timestamps #391

Signed-off-by: Michael Mayer <michael@liquidbytes.net>
This commit is contained in:
Michael Mayer 2020-07-17 16:09:55 +02:00
parent 31647943d9
commit cc946b8ea8
17 changed files with 191 additions and 163 deletions

View File

@ -88,14 +88,6 @@
</v-list-tile-content>
</v-list-tile>
<v-list-tile :to="{name: 'photos', query: { q: 'stack:true' }}" :exact="true" @click="" class="nav-stacks">
<v-list-tile-content>
<v-list-tile-title>
<translate>Stacks</translate>
</v-list-tile-title>
</v-list-tile-content>
</v-list-tile>
<v-list-tile :to="{name: 'photos', query: { q: 'panorama:true' }}" :exact="true" @click="" class="nav-panoramas">
<v-list-tile-content>
<v-list-tile-title>
@ -104,6 +96,14 @@
</v-list-tile-content>
</v-list-tile>
<v-list-tile :to="{name: 'photos', query: { q: 'stack:true' }}" :exact="true" @click="" class="nav-stacks">
<v-list-tile-content>
<v-list-tile-title>
<translate>Stacks</translate>
</v-list-tile-title>
</v-list-tile-content>
</v-list-tile>
<v-list-tile :to="{name: 'photos', query: { q: 'scan:true' }}" :exact="true" @click="" class="nav-scans">
<v-list-tile-content>
<v-list-tile-title>

Binary file not shown.

View File

@ -25,7 +25,7 @@ msgstr "%{n} Einträge gefunden"
msgid "%{n} files uploaded"
msgstr "%{n} Dateien hochgeladen"
#: src/pages/library/files.vue:420
#: src/pages/library/files.vue:406
msgid "%{n} folders found"
msgstr "%{n} Ordner gefunden"
@ -212,7 +212,7 @@ msgstr ""
msgid "Altitude"
msgstr "Höhe"
#: src/dialog/photo/details.vue:453
#: src/dialog/photo/details.vue:454
msgid "Altitude (m)"
msgstr "Höhe (m)"
@ -268,7 +268,7 @@ msgstr "Diese Kategorie wirklich löschen?"
msgid "Are you sure you want to delete this account?"
msgstr "Diesen Account wirklich löschen?"
#: src/dialog/photo/details.vue:458
#: src/dialog/photo/details.vue:459
msgid "Artist"
msgstr "Ersteller"
@ -314,7 +314,7 @@ msgstr "Kalender"
#: src/component/album/toolbar.vue:120 src/component/photo/list.vue:138
#: src/component/photo/toolbar.vue:201 src/dialog/album/edit.vue:126
#: src/dialog/photo/details.vue:440 src/share/photo/list.vue:115
#: src/dialog/photo/details.vue:441 src/share/photo/list.vue:115
msgid "Camera"
msgstr "Kamera"
@ -341,7 +341,7 @@ msgid "Cards"
msgstr "Karteikarten"
#: src/component/album/toolbar.vue:122 src/component/photo/toolbar.vue:206
#: src/dialog/album/edit.vue:128 src/dialog/photo/details.vue:444
#: src/dialog/album/edit.vue:128 src/dialog/photo/details.vue:445
#: src/pages/albums.vue:257 src/share/albums.vue:155
msgid "Category"
msgstr "Kategorie"
@ -375,7 +375,7 @@ msgstr "Schließen"
msgid "Codec"
msgstr "Codec"
#: src/component/photo/toolbar.vue:205 src/dialog/photo/details.vue:443
#: src/component/photo/toolbar.vue:205 src/dialog/photo/details.vue:444
msgid "Color"
msgstr "Farbe"
@ -423,7 +423,7 @@ msgstr "In Zwischenablage kopiert"
msgid "Copy"
msgstr "Kopieren"
#: src/dialog/photo/details.vue:459
#: src/dialog/photo/details.vue:460
msgid "Copyright"
msgstr "Copyright"
@ -447,7 +447,7 @@ msgid "Couldn't find recently edited"
msgstr "Bisher nichts bearbeitet"
#: src/component/album/toolbar.vue:119 src/component/photo/toolbar.vue:200
#: src/dialog/album/edit.vue:125 src/dialog/photo/details.vue:439
#: src/dialog/album/edit.vue:125 src/dialog/photo/details.vue:440
msgid "Country"
msgstr "Land"
@ -499,7 +499,7 @@ msgid "Delete"
msgstr "Löschen"
#: src/component/album/toolbar.vue:116 src/dialog/album/edit.vue:122
#: src/dialog/photo/details.vue:461
#: src/dialog/photo/details.vue:462
msgid "Description"
msgstr "Beschreibung"
@ -620,11 +620,11 @@ msgstr ""
msgid "Expires"
msgstr "Ablaufdatum"
#: src/dialog/photo/details.vue:454
#: src/dialog/photo/details.vue:455
msgid "Exposure"
msgstr "Belichtungszeit"
#: src/dialog/photo/details.vue:455
#: src/dialog/photo/details.vue:456
msgid "F Number"
msgstr "F Nummer"
@ -685,27 +685,26 @@ msgstr ""
"Dateien mit Namen wie IMG_1234 (2) oder IMG_1234 copy 2 werden als "
"Stapel zusammengefasst."
#: src/dialog/photo/details.vue:456
#: src/dialog/photo/details.vue:457
msgid "Focal Length"
msgstr "Brennweite"
#: src/dialog/account/edit.vue:326 src/dialog/account/edit.vue:332
#: src/dialog/photo/files.vue:54 src/dialog/photo/info.vue:24
#: src/dialog/share/upload.vue:147 src/model/folder.js:187
#: src/pages/library/files.vue:84 src/pages/library/import.vue:120
#: src/pages/library/index.vue:117
#: src/dialog/photo/info.vue:24 src/dialog/share/upload.vue:147
#: src/model/folder.js:187 src/pages/library/files.vue:81
#: src/pages/library/import.vue:120 src/pages/library/index.vue:117
msgid "Folder"
msgstr "Ordner"
#: src/pages/library/files.vue:422
#: src/pages/library/files.vue:408
msgid "Folder contains %{n} files"
msgstr "Ordner enthält %{n} Dateien"
#: src/pages/library/files.vue:414
#: src/pages/library/files.vue:400
msgid "Folder is empty"
msgstr "Ordner ist leer"
#: src/pages/library/files.vue:178
#: src/pages/library/files.vue:175
msgid "Folder Name"
msgstr "Ordnername"
@ -847,7 +846,7 @@ msgstr "Indiziere Fotos, Videos und Sidecar-Dateien…"
msgid "Interval"
msgstr "Intervall"
#: src/dialog/photo/details.vue:544
#: src/dialog/photo/details.vue:545
msgid "Invalid date"
msgstr "Ungültiges Datum"
@ -859,7 +858,7 @@ msgstr "Eintrag"
msgid "JPEGs and thumbnails are automatically rendered as needed."
msgstr "JPEGs und Thumbnails werden bei Bedarf automatisch erstellt."
#: src/dialog/photo/details.vue:462
#: src/dialog/photo/details.vue:463
msgid "Keywords"
msgstr "Suchbegriffe"
@ -880,7 +879,7 @@ msgstr "Kategorien"
msgid "Labels deleted"
msgstr "Kategorien gelöscht"
#: src/dialog/photo/details.vue:448 src/pages/settings/general.vue:265
#: src/dialog/photo/details.vue:449 src/pages/settings/general.vue:265
msgid "Language"
msgstr "Sprache"
@ -888,7 +887,7 @@ msgstr "Sprache"
msgid "Last Backup"
msgstr "Letztes Backup"
#: src/dialog/photo/details.vue:451 src/dialog/photo/info.vue:117
#: src/dialog/photo/details.vue:452 src/dialog/photo/info.vue:117
msgid "Latitude"
msgstr "Breitengrad"
@ -896,7 +895,7 @@ msgstr "Breitengrad"
msgid "Lavender"
msgstr "Lavendel"
#: src/component/photo/toolbar.vue:202 src/dialog/photo/details.vue:441
#: src/component/photo/toolbar.vue:202 src/dialog/photo/details.vue:442
msgid "Lens"
msgstr "Objektiv"
@ -913,7 +912,7 @@ msgid "Library"
msgstr "Dateien"
#: src/component/navigation.vue:347 src/component/navigation.vue:33
#: src/dialog/photo/details.vue:460 src/pages/about/license.vue:4
#: src/dialog/photo/details.vue:461 src/pages/about/license.vue:4
msgid "License"
msgstr "Lizenz"
@ -921,7 +920,7 @@ msgstr "Lizenz"
msgid "Lime"
msgstr "Hellgrün"
#: src/pages/library/files.vue:424
#: src/pages/library/files.vue:410
msgid "Limit reached, showing first %{n} files"
msgstr "Limit erreicht, zeige erste %{n} Dateien"
@ -970,7 +969,7 @@ msgstr "Abmelden"
msgid "Logs"
msgstr "Logs"
#: src/dialog/photo/details.vue:452 src/dialog/photo/info.vue:125
#: src/dialog/photo/details.vue:453 src/dialog/photo/info.vue:125
msgid "Longitude"
msgstr "Längengrad"
@ -1064,7 +1063,7 @@ msgstr "Name"
#: src/component/album/toolbar.vue:124 src/dialog/album/edit.vue:119
#: src/dialog/photo/labels.vue:117 src/pages/labels.vue:199
#: src/pages/library/files.vue:180
#: src/pages/library/files.vue:177
msgid "Name too long"
msgstr "Name zu lang"
@ -1171,7 +1170,7 @@ msgstr ""
"Note: Bereits angemeldete Benutzer werden nach ändern des Passworts nicht "
"automatisch abgemeldet."
#: src/dialog/photo/details.vue:463
#: src/dialog/photo/details.vue:464
msgid "Notes"
msgstr "Notizen"
@ -1200,11 +1199,11 @@ msgstr "Ein Album gefunden"
msgid "One entry found"
msgstr "Ein Eintrag gefunden"
#: src/pages/library/files.vue:416
#: src/pages/library/files.vue:402
msgid "One file found"
msgstr "Eine Datei gefunden"
#: src/pages/library/files.vue:418
#: src/pages/library/files.vue:404
msgid "One folder found"
msgstr "Ein Ordner gefunden"
@ -1241,7 +1240,7 @@ msgstr "Originale"
msgid "Panorama"
msgstr "Panorama"
#: src/component/navigation.vue:86
#: src/component/navigation.vue:78
msgid "Panoramas"
msgstr "Panoramas"
@ -1466,9 +1465,9 @@ msgstr "Scans"
#: src/component/album/toolbar.vue:117 src/component/photo/toolbar.vue:198
#: src/component/photo/toolbar.vue:33 src/dialog/album/edit.vue:123
#: src/dialog/photo/details.vue:437 src/dialog/photo/labels.vue:114
#: src/dialog/photo/details.vue:438 src/dialog/photo/labels.vue:114
#: src/pages/albums.vue:255 src/pages/labels.vue:196
#: src/pages/library/errors.vue:33 src/pages/library/files.vue:177
#: src/pages/library/errors.vue:33 src/pages/library/files.vue:174
#: src/pages/places.vue:174 src/routes.js:235 src/share/albums.vue:153
msgid "Search"
msgstr "Suche"
@ -1479,7 +1478,7 @@ msgstr "Fotos und Videos auf verschiedenen Weltkarten anzeigen und filtern."
#: src/pages/album/photos.vue:278 src/pages/albums.vue:399
#: src/pages/labels.vue:360 src/pages/library/errors.vue:123
#: src/pages/library/files.vue:345 src/pages/photos.vue:313
#: src/pages/library/files.vue:331 src/pages/photos.vue:313
#: src/pages/places.vue:208 src/share/albums.vue:279 src/share/photos.vue:321
msgid "Search term too short"
msgstr "Suchbegriff zu kurz"
@ -1584,7 +1583,7 @@ msgid "Sort by file name"
msgstr "Dateinamen"
#: src/component/album/toolbar.vue:121 src/component/photo/toolbar.vue:207
#: src/dialog/album/edit.vue:127 src/dialog/photo/details.vue:445
#: src/dialog/album/edit.vue:127 src/dialog/photo/details.vue:446
msgid "Sort Order"
msgstr "Sortierung"
@ -1596,7 +1595,7 @@ msgstr "Quelle"
msgid "Spanish"
msgstr "Spanisch"
#: src/component/navigation.vue:78
#: src/component/navigation.vue:86
msgid "Stacks"
msgstr "Bildstapel"
@ -1612,6 +1611,10 @@ msgstr "Länder"
msgid "Status"
msgstr "Status"
#: src/dialog/photo/files.vue:54
msgid "Storage Folder"
msgstr "Ablageverzeichnis"
#: src/options/options.js:160
msgid "Streets"
msgstr "Straßen"
@ -1620,7 +1623,7 @@ msgstr "Straßen"
msgid "Style"
msgstr "Style"
#: src/dialog/photo/details.vue:457
#: src/dialog/photo/details.vue:458
msgid "Subject"
msgstr "Bildinhalt"
@ -1642,11 +1645,11 @@ msgstr "RAW-Dateien sichern"
msgid "Taken"
msgstr "Aufgenommen"
#: src/component/photo/toolbar.vue:209 src/dialog/photo/details.vue:447
#: src/component/photo/toolbar.vue:209 src/dialog/photo/details.vue:448
msgid "Taken after"
msgstr "Erstell nach"
#: src/component/photo/toolbar.vue:208 src/dialog/photo/details.vue:446
#: src/component/photo/toolbar.vue:208 src/dialog/photo/details.vue:447
msgid "Taken before"
msgstr "Erstellt vor"
@ -1654,7 +1657,7 @@ msgstr "Erstellt vor"
msgid "Teal"
msgstr "Blaugrün"
#: src/dialog/photo/details.vue:470
#: src/dialog/photo/details.vue:471
msgid "Text too long"
msgstr "Text ist zu lang"
@ -1688,11 +1691,11 @@ msgstr ""
msgid "Time UTC"
msgstr "Zeit UTC"
#: src/dialog/photo/details.vue:449
#: src/dialog/photo/details.vue:450
msgid "Time Zone"
msgstr "Zeitzone"
#: src/component/photo/list.vue:136 src/dialog/photo/details.vue:450
#: src/component/photo/list.vue:136 src/dialog/photo/details.vue:451
#: src/dialog/photo/info.vue:44 src/share/photo/list.vue:113
msgid "Title"
msgstr "Titel"
@ -1735,7 +1738,7 @@ msgstr "Typ"
msgid "UID"
msgstr "UID"
#: src/dialog/photo/details.vue:431 src/dialog/photo/info.vue:254
#: src/dialog/photo/details.vue:432 src/dialog/photo/info.vue:254
#: src/model/album.js:122 src/model/photo.js:401 src/model/photo.js:415
#: src/model/photo.js:438 src/model/photo.js:452 src/model/photo.js:529
#: src/model/photo.js:542 src/options/options.js:15 src/options/options.js:29
@ -1823,7 +1826,7 @@ msgid "Videos"
msgstr "Videos"
#: src/component/album/toolbar.vue:118 src/component/photo/toolbar.vue:199
#: src/dialog/album/edit.vue:124 src/dialog/photo/details.vue:438
#: src/dialog/album/edit.vue:124 src/dialog/photo/details.vue:439
msgid "View"
msgstr "Ansicht"
@ -1856,7 +1859,7 @@ msgstr "Weiß"
msgid "Who we are"
msgstr "Über uns"
#: src/component/photo/toolbar.vue:203 src/dialog/photo/details.vue:442
#: src/component/photo/toolbar.vue:203 src/dialog/photo/details.vue:443
#: src/dialog/photo/details.vue:240
msgid "Year"
msgstr "Jahr"
@ -2224,9 +2227,6 @@ msgstr ""
#~ msgid "Prev"
#~ msgstr "Zurück"
#~ msgid "Story"
#~ msgstr "Story"
#~ msgid "Week"
#~ msgstr "Woche"

File diff suppressed because one or more lines are too long

View File

@ -19,7 +19,7 @@ msgstr ""
msgid "%{n} files uploaded"
msgstr ""
#: src/pages/library/files.vue:420
#: src/pages/library/files.vue:406
msgid "%{n} folders found"
msgstr ""
@ -214,7 +214,7 @@ msgstr ""
msgid "Altitude"
msgstr ""
#: src/dialog/photo/details.vue:453
#: src/dialog/photo/details.vue:454
msgid "Altitude (m)"
msgstr ""
@ -272,7 +272,7 @@ msgstr ""
msgid "Are you sure you want to delete this account?"
msgstr ""
#: src/dialog/photo/details.vue:458
#: src/dialog/photo/details.vue:459
msgid "Artist"
msgstr ""
@ -322,7 +322,7 @@ msgstr ""
#: src/component/photo/list.vue:138
#: src/component/photo/toolbar.vue:201
#: src/dialog/album/edit.vue:126
#: src/dialog/photo/details.vue:440
#: src/dialog/photo/details.vue:441
#: src/share/photo/list.vue:115
msgid "Camera"
msgstr ""
@ -360,7 +360,7 @@ msgstr ""
#: src/component/album/toolbar.vue:122
#: src/component/photo/toolbar.vue:206
#: src/dialog/album/edit.vue:128
#: src/dialog/photo/details.vue:444
#: src/dialog/photo/details.vue:445
#: src/pages/albums.vue:257
#: src/share/albums.vue:155
msgid "Category"
@ -398,7 +398,7 @@ msgid "Codec"
msgstr ""
#: src/component/photo/toolbar.vue:205
#: src/dialog/photo/details.vue:443
#: src/dialog/photo/details.vue:444
msgid "Color"
msgstr ""
@ -450,7 +450,7 @@ msgstr ""
msgid "Copy"
msgstr ""
#: src/dialog/photo/details.vue:459
#: src/dialog/photo/details.vue:460
msgid "Copyright"
msgstr ""
@ -485,7 +485,7 @@ msgstr ""
#: src/component/album/toolbar.vue:119
#: src/component/photo/toolbar.vue:200
#: src/dialog/album/edit.vue:125
#: src/dialog/photo/details.vue:439
#: src/dialog/photo/details.vue:440
msgid "Country"
msgstr ""
@ -541,7 +541,7 @@ msgstr ""
#: src/component/album/toolbar.vue:116
#: src/dialog/album/edit.vue:122
#: src/dialog/photo/details.vue:461
#: src/dialog/photo/details.vue:462
msgid "Description"
msgstr ""
@ -673,11 +673,11 @@ msgstr ""
msgid "Expires"
msgstr ""
#: src/dialog/photo/details.vue:454
#: src/dialog/photo/details.vue:455
msgid "Exposure"
msgstr ""
#: src/dialog/photo/details.vue:455
#: src/dialog/photo/details.vue:456
msgid "F Number"
msgstr ""
@ -732,31 +732,30 @@ msgstr ""
msgid "Files with sequential names like 'IMG_1234 (2)' or 'IMG_1234 copy 2' belong to the same photo."
msgstr ""
#: src/dialog/photo/details.vue:456
#: src/dialog/photo/details.vue:457
msgid "Focal Length"
msgstr ""
#: src/dialog/account/edit.vue:326
#: src/dialog/account/edit.vue:332
#: src/dialog/photo/files.vue:54
#: src/dialog/photo/info.vue:24
#: src/dialog/share/upload.vue:147
#: src/model/folder.js:187
#: src/pages/library/files.vue:84
#: src/pages/library/files.vue:81
#: src/pages/library/import.vue:120
#: src/pages/library/index.vue:117
msgid "Folder"
msgstr ""
#: src/pages/library/files.vue:422
#: src/pages/library/files.vue:408
msgid "Folder contains %{n} files"
msgstr ""
#: src/pages/library/files.vue:414
#: src/pages/library/files.vue:400
msgid "Folder is empty"
msgstr ""
#: src/pages/library/files.vue:178
#: src/pages/library/files.vue:175
msgid "Folder Name"
msgstr ""
@ -895,7 +894,7 @@ msgstr ""
msgid "Interval"
msgstr ""
#: src/dialog/photo/details.vue:544
#: src/dialog/photo/details.vue:545
msgid "Invalid date"
msgstr ""
@ -907,7 +906,7 @@ msgstr ""
msgid "JPEGs and thumbnails are automatically rendered as needed."
msgstr ""
#: src/dialog/photo/details.vue:462
#: src/dialog/photo/details.vue:463
msgid "Keywords"
msgstr ""
@ -932,7 +931,7 @@ msgstr ""
msgid "Labels deleted"
msgstr ""
#: src/dialog/photo/details.vue:448
#: src/dialog/photo/details.vue:449
#: src/pages/settings/general.vue:265
msgid "Language"
msgstr ""
@ -941,7 +940,7 @@ msgstr ""
msgid "Last Backup"
msgstr ""
#: src/dialog/photo/details.vue:451
#: src/dialog/photo/details.vue:452
#: src/dialog/photo/info.vue:117
msgid "Latitude"
msgstr ""
@ -951,7 +950,7 @@ msgid "Lavender"
msgstr ""
#: src/component/photo/toolbar.vue:202
#: src/dialog/photo/details.vue:441
#: src/dialog/photo/details.vue:442
msgid "Lens"
msgstr ""
@ -971,7 +970,7 @@ msgstr ""
#: src/component/navigation.vue:347
#: src/component/navigation.vue:33
#: src/dialog/photo/details.vue:460
#: src/dialog/photo/details.vue:461
#: src/pages/about/license.vue:4
msgid "License"
msgstr ""
@ -980,7 +979,7 @@ msgstr ""
msgid "Lime"
msgstr ""
#: src/pages/library/files.vue:424
#: src/pages/library/files.vue:410
msgid "Limit reached, showing first %{n} files"
msgstr ""
@ -1028,7 +1027,7 @@ msgstr ""
msgid "Logs"
msgstr ""
#: src/dialog/photo/details.vue:452
#: src/dialog/photo/details.vue:453
#: src/dialog/photo/info.vue:125
msgid "Longitude"
msgstr ""
@ -1140,7 +1139,7 @@ msgstr ""
#: src/dialog/album/edit.vue:119
#: src/dialog/photo/labels.vue:117
#: src/pages/labels.vue:199
#: src/pages/library/files.vue:180
#: src/pages/library/files.vue:177
msgid "Name too long"
msgstr ""
@ -1239,7 +1238,7 @@ msgstr ""
msgid "Note: Updating the password will not revoke access from already authenticated users."
msgstr ""
#: src/dialog/photo/details.vue:463
#: src/dialog/photo/details.vue:464
msgid "Notes"
msgstr ""
@ -1272,11 +1271,11 @@ msgstr ""
msgid "One entry found"
msgstr ""
#: src/pages/library/files.vue:416
#: src/pages/library/files.vue:402
msgid "One file found"
msgstr ""
#: src/pages/library/files.vue:418
#: src/pages/library/files.vue:404
msgid "One folder found"
msgstr ""
@ -1315,7 +1314,7 @@ msgstr ""
msgid "Panorama"
msgstr ""
#: src/component/navigation.vue:86
#: src/component/navigation.vue:78
msgid "Panoramas"
msgstr ""
@ -1551,12 +1550,12 @@ msgstr ""
#: src/component/photo/toolbar.vue:198
#: src/component/photo/toolbar.vue:33
#: src/dialog/album/edit.vue:123
#: src/dialog/photo/details.vue:437
#: src/dialog/photo/details.vue:438
#: src/dialog/photo/labels.vue:114
#: src/pages/albums.vue:255
#: src/pages/labels.vue:196
#: src/pages/library/errors.vue:33
#: src/pages/library/files.vue:177
#: src/pages/library/files.vue:174
#: src/pages/places.vue:174
#: src/routes.js:235
#: src/share/albums.vue:153
@ -1571,7 +1570,7 @@ msgstr ""
#: src/pages/albums.vue:399
#: src/pages/labels.vue:360
#: src/pages/library/errors.vue:123
#: src/pages/library/files.vue:345
#: src/pages/library/files.vue:331
#: src/pages/photos.vue:313
#: src/pages/places.vue:208
#: src/share/albums.vue:279
@ -1690,7 +1689,7 @@ msgstr ""
#: src/component/album/toolbar.vue:121
#: src/component/photo/toolbar.vue:207
#: src/dialog/album/edit.vue:127
#: src/dialog/photo/details.vue:445
#: src/dialog/photo/details.vue:446
msgid "Sort Order"
msgstr ""
@ -1702,7 +1701,7 @@ msgstr ""
msgid "Spanish"
msgstr ""
#: src/component/navigation.vue:78
#: src/component/navigation.vue:86
msgid "Stacks"
msgstr ""
@ -1718,6 +1717,10 @@ msgstr ""
msgid "Status"
msgstr ""
#: src/dialog/photo/files.vue:54
msgid "Storage Folder"
msgstr ""
#: src/options/options.js:160
msgid "Streets"
msgstr ""
@ -1726,7 +1729,7 @@ msgstr ""
msgid "Style"
msgstr ""
#: src/dialog/photo/details.vue:457
#: src/dialog/photo/details.vue:458
msgid "Subject"
msgstr ""
@ -1749,12 +1752,12 @@ msgid "Taken"
msgstr ""
#: src/component/photo/toolbar.vue:209
#: src/dialog/photo/details.vue:447
#: src/dialog/photo/details.vue:448
msgid "Taken after"
msgstr ""
#: src/component/photo/toolbar.vue:208
#: src/dialog/photo/details.vue:446
#: src/dialog/photo/details.vue:447
msgid "Taken before"
msgstr ""
@ -1762,7 +1765,7 @@ msgstr ""
msgid "Teal"
msgstr ""
#: src/dialog/photo/details.vue:470
#: src/dialog/photo/details.vue:471
msgid "Text too long"
msgstr ""
@ -1787,12 +1790,12 @@ msgstr ""
msgid "Time UTC"
msgstr ""
#: src/dialog/photo/details.vue:449
#: src/dialog/photo/details.vue:450
msgid "Time Zone"
msgstr ""
#: src/component/photo/list.vue:136
#: src/dialog/photo/details.vue:450
#: src/dialog/photo/details.vue:451
#: src/dialog/photo/info.vue:44
#: src/share/photo/list.vue:113
msgid "Title"
@ -1846,7 +1849,7 @@ msgstr ""
msgid "UID"
msgstr ""
#: src/dialog/photo/details.vue:431
#: src/dialog/photo/details.vue:432
#: src/dialog/photo/info.vue:254
#: src/model/album.js:122
#: src/model/photo.js:401
@ -1956,7 +1959,7 @@ msgstr ""
#: src/component/album/toolbar.vue:118
#: src/component/photo/toolbar.vue:199
#: src/dialog/album/edit.vue:124
#: src/dialog/photo/details.vue:438
#: src/dialog/photo/details.vue:439
msgid "View"
msgstr ""
@ -1986,7 +1989,7 @@ msgid "Who we are"
msgstr ""
#: src/component/photo/toolbar.vue:203
#: src/dialog/photo/details.vue:442
#: src/dialog/photo/details.vue:443
#: src/dialog/photo/details.vue:240
msgid "Year"
msgstr ""

View File

@ -45,8 +45,8 @@ export class File extends RestModel {
Name: "",
OriginalName: "",
Hash: "",
Modified: "",
Size: 0,
ModTime: 0,
Codec: "",
Type: "",
Mime: "",

View File

@ -203,19 +203,8 @@
const model = this.results[index];
if (model.isFile()) {
if (model.Type === TypeJpeg) {
const photo = new Photo({
UID: model.PhotoUID,
Title: model.Name,
TakenAt: model.Modified,
Description: "",
Favorite: false,
Files: [model]
});
this.$viewer.show(Thumb.fromPhotos([photo]), 0);
} else {
this.downloadFile(index);
}
// Open Edit Dialog
Event.publish("dialog.edit", {selection: [model.PhotoUID], album: null, index: 0});
} else {
this.$router.push({path: '/library/files/' + model.Path});
}

View File

@ -141,7 +141,7 @@ func (t *TensorFlow) loadModel() error {
modelPath := path.Join(t.modelsPath, t.modelName)
log.Infof("classify: loading model from %s", txt.Quote(filepath.Base(modelPath)))
log.Infof("classify: loading %s", txt.Quote(filepath.Base(modelPath)))
// Load model
model, err := tf.LoadSavedModel(modelPath, t.modelTags, nil)

View File

@ -26,7 +26,6 @@ type File struct {
FileRoot string `gorm:"type:varbinary(16);default:'';unique_index:idx_files_name_root;" json:"Root" yaml:"Root,omitempty"`
OriginalName string `gorm:"type:varbinary(768);" json:"OriginalName" yaml:"OriginalName,omitempty"`
FileHash string `gorm:"type:varbinary(128);index" json:"Hash" yaml:"Hash,omitempty"`
FileModified time.Time `json:"Modified" yaml:"Modified,omitempty"`
FileSize int64 `json:"Size" yaml:"Size,omitempty"`
FileCodec string `gorm:"type:varbinary(32)" json:"Codec" yaml:"Codec,omitempty"`
FileType string `gorm:"type:varbinary(32)" json:"Type" yaml:"Type,omitempty"`
@ -49,13 +48,14 @@ type File struct {
FileDiff uint32 `json:"Diff" yaml:"Diff,omitempty"`
FileChroma uint8 `json:"Chroma" yaml:"Chroma,omitempty"`
FileError string `gorm:"type:varbinary(512)" json:"Error" yaml:"Error,omitempty"`
Share []FileShare `json:"-" yaml:"-"`
Sync []FileSync `json:"-" yaml:"-"`
ModTime int64 `json:"ModTime" yaml:"-"`
CreatedAt time.Time `json:"CreatedAt" yaml:"-"`
CreatedIn int64 `json:"CreatedIn" yaml:"-"`
UpdatedAt time.Time `json:"UpdatedAt" yaml:"-"`
UpdatedIn int64 `json:"UpdatedIn" yaml:"-"`
DeletedAt *time.Time `sql:"index" json:"DeletedAt,omitempty" yaml:"-"`
Share []FileShare `json:"-" yaml:"-"`
Sync []FileSync `json:"-" yaml:"-"`
}
type FileInfos struct {
@ -119,7 +119,7 @@ func (m *File) ShareFileName() string {
}
// Changed returns true if new and old file size or modified time are different.
func (m File) Changed(fileSize int64, fileModified time.Time) bool {
func (m File) Changed(fileSize int64, modTime time.Time) bool {
if m.DeletedAt != nil {
return true
}
@ -128,7 +128,7 @@ func (m File) Changed(fileSize int64, fileModified time.Time) bool {
return true
}
if m.FileModified.Round(time.Second).Equal(fileModified.Round(time.Second)) {
if m.ModTime == modTime.Unix() {
return false
}

View File

@ -14,7 +14,7 @@ var FileFixtures = map[string]File{
FileName: "exampleFileName.jpg",
OriginalName: "exampleFileNameOriginal.jpg",
FileHash: "2cad9168fa6acc5c5c2965ddf6ec465ca42fd818",
FileModified: time.Date(2020, 3, 6, 2, 6, 51, 0, time.UTC),
ModTime: time.Date(2020, 3, 6, 2, 6, 51, 0, time.UTC).Unix(),
FileSize: 4278906,
FileType: "jpg",
FileMime: "image/jpg",
@ -54,7 +54,7 @@ var FileFixtures = map[string]File{
FileName: "exampleDNGFile.dng",
OriginalName: "exampleDNGFile.dng",
FileHash: "3cad9168fa6acc5c5c2965ddf6ec465ca42fd818",
FileModified: time.Date(2019, 3, 6, 2, 6, 51, 0, time.UTC),
ModTime: time.Date(2019, 3, 6, 2, 6, 51, 0, time.UTC).Unix(),
FileSize: 661858,
FileType: "dng",
FileMime: "image/dng",
@ -91,7 +91,7 @@ var FileFixtures = map[string]File{
FileName: "exampleXmpFile.xmp",
OriginalName: "exampleXmpFile.xmp",
FileHash: "ocad9168fa6acc5c5c2965ddf6ec465ca42fd818",
FileModified: time.Date(2019, 3, 6, 2, 6, 51, 0, time.UTC),
ModTime: time.Date(2019, 3, 6, 2, 6, 51, 0, time.UTC).Unix(),
FileSize: 858,
FileType: "xmp",
FileMime: "text/xmp",
@ -128,7 +128,7 @@ var FileFixtures = map[string]File{
FileName: "bridge.jpg",
OriginalName: "bridgeOriginal.jpg",
FileHash: "pcad9168fa6acc5c5c2965ddf6ec465ca42fd818",
FileModified: time.Date(2017, 2, 6, 2, 6, 51, 0, time.UTC),
ModTime: time.Date(2017, 2, 6, 2, 6, 51, 0, time.UTC).Unix(),
FileSize: 961858,
FileType: "jpg",
FileMime: "image/jpg",
@ -165,7 +165,7 @@ var FileFixtures = map[string]File{
FileName: "reunion.jpg",
OriginalName: "reunionOriginal.jpg",
FileHash: "acad9168fa6acc5c5c2965ddf6ec465ca42fd818",
FileModified: time.Date(2017, 1, 6, 2, 6, 51, 0, time.UTC),
ModTime: time.Date(2017, 1, 6, 2, 6, 51, 0, time.UTC).Unix(),
FileSize: 81858,
FileType: "jpg",
FileMime: "image/jpg",
@ -202,7 +202,7 @@ var FileFixtures = map[string]File{
FileName: "Quality1FavoriteTrue.jpg",
OriginalName: "Quality1FavoriteTrue.jpg",
FileHash: "acad9168fa6acc5c5c2965ddf6ec465ca42fd819",
FileModified: time.Date(2017, 1, 6, 2, 6, 51, 0, time.UTC),
ModTime: time.Date(2017, 1, 6, 2, 6, 51, 0, time.UTC).Unix(),
FileSize: 500,
FileType: "jpg",
FileMime: "image/jpg",
@ -239,7 +239,7 @@ var FileFixtures = map[string]File{
FileName: "missing.jpg",
OriginalName: "missing.jpg",
FileHash: "acad9168fa6acc5c5c2965ddf6ec465ca42fd819",
FileModified: time.Date(2017, 1, 6, 2, 6, 51, 0, time.UTC),
ModTime: time.Date(2017, 1, 6, 2, 6, 51, 0, time.UTC).Unix(),
FileSize: 500,
FileType: "jpg",
FileMime: "image/jpg",
@ -276,7 +276,7 @@ var FileFixtures = map[string]File{
FileName: "Photo18.jpg",
OriginalName: "Photo18.jpg",
FileHash: "acad9168fa6acc5c5c2965ddf6ec465ca42fd820",
FileModified: time.Date(2017, 1, 6, 2, 6, 51, 0, time.UTC),
ModTime: time.Date(2017, 1, 6, 2, 6, 51, 0, time.UTC).Unix(),
FileSize: 500,
FileType: "jpg",
FileMime: "image/jpg",
@ -313,7 +313,7 @@ var FileFixtures = map[string]File{
FileName: "Video.mp4",
OriginalName: "Video.mp4",
FileHash: "acad9168fa6acc5c5c2965ddf6ec465ca42fd831",
FileModified: time.Date(2017, 1, 6, 2, 6, 51, 0, time.UTC),
ModTime: time.Date(2017, 1, 6, 2, 6, 51, 0, time.UTC).Unix(),
FileSize: 500,
FileType: "mp4",
FileMime: "video/mp4",
@ -350,7 +350,7 @@ var FileFixtures = map[string]File{
FileName: "VideoError.mp4",
OriginalName: "VideoError.mp4",
FileHash: "acad9168fa6acc5c5c2965ddf6ec465ca42fd832",
FileModified: time.Date(2017, 1, 6, 2, 6, 51, 0, time.UTC),
ModTime: time.Date(2017, 1, 6, 2, 6, 51, 0, time.UTC).Unix(),
FileSize: 500,
FileType: "mp4",
FileMime: "video/mp4",
@ -387,7 +387,7 @@ var FileFixtures = map[string]File{
FileName: "bridge1.jpg",
OriginalName: "bridgeOriginal1.jpg",
FileHash: "pcad9168fa6acc5c5c2965ddf6ec465ca42fd828",
FileModified: time.Date(2017, 2, 6, 2, 6, 51, 0, time.UTC),
ModTime: time.Date(2017, 2, 6, 2, 6, 51, 0, time.UTC).Unix(),
FileSize: 961851,
FileType: "jpg",
FileMime: "image/jpg",
@ -424,7 +424,7 @@ var FileFixtures = map[string]File{
FileName: "bridge2.jpg",
OriginalName: "bridgeOriginal2.jpg",
FileHash: "pcad9168fa6acc5c5c2965adf6ec465ca42fd818",
FileModified: time.Date(2017, 2, 6, 2, 6, 51, 0, time.UTC),
ModTime: time.Date(2017, 2, 6, 2, 6, 51, 0, time.UTC).Unix(),
FileSize: 921858,
FileType: "jpg",
FileMime: "image/jpg",
@ -461,7 +461,7 @@ var FileFixtures = map[string]File{
FileName: "bridge3.jpg",
OriginalName: "bridgeOriginal.jpg",
FileHash: "pcad9168fa6acc5c5ba965adf6ec465ca42fd818",
FileModified: time.Date(2017, 2, 6, 2, 6, 51, 0, time.UTC),
ModTime: time.Date(2017, 2, 6, 2, 6, 51, 0, time.UTC).Unix(),
FileSize: 921851,
FileType: "jpg",
FileMime: "image/jpg",
@ -498,7 +498,7 @@ var FileFixtures = map[string]File{
FileName: "bridge.mp4",
OriginalName: "bridgeOriginal.mp4",
FileHash: "pcad9168fa6acc5c5ba965adf6ec465ca42fd819",
FileModified: time.Date(2017, 2, 6, 2, 6, 51, 0, time.UTC),
ModTime: time.Date(2017, 2, 6, 2, 6, 51, 0, time.UTC).Unix(),
FileSize: 921851,
FileType: "mp4",
FileMime: "image/mp4",

View File

@ -69,22 +69,22 @@ func TestFile_ShareFileName(t *testing.T) {
func TestFile_Changed(t *testing.T) {
var deletedAt = time.Date(2019, 01, 15, 0, 0, 0, 0, time.UTC)
t.Run("different modified times", func(t *testing.T) {
file := &File{Photo: nil, FileType: "jpg", FileSize: 500, FileModified: time.Date(2019, 01, 15, 0, 0, 0, 0, time.UTC)}
file := &File{Photo: nil, FileType: "jpg", FileSize: 500, ModTime: time.Date(2019, 01, 15, 0, 0, 0, 0, time.UTC).Unix()}
time := time.Date(2020, 01, 15, 0, 0, 0, 0, time.UTC)
assert.Equal(t, true, file.Changed(500, time))
})
t.Run("different sizes", func(t *testing.T) {
file := &File{Photo: nil, FileType: "jpg", FileSize: 600, FileModified: time.Date(2019, 01, 15, 0, 0, 0, 0, time.UTC)}
file := &File{Photo: nil, FileType: "jpg", FileSize: 600, ModTime: time.Date(2019, 01, 15, 0, 0, 0, 0, time.UTC).Unix()}
time := time.Date(2019, 01, 15, 0, 0, 0, 0, time.UTC)
assert.Equal(t, true, file.Changed(500, time))
})
t.Run("no change", func(t *testing.T) {
file := &File{Photo: nil, FileType: "jpg", FileSize: 500, FileModified: time.Date(2019, 01, 15, 0, 0, 0, 0, time.UTC)}
file := &File{Photo: nil, FileType: "jpg", FileSize: 500, ModTime: time.Date(2019, 01, 15, 0, 0, 0, 0, time.UTC).Unix()}
time := time.Date(2019, 01, 15, 0, 0, 0, 0, time.UTC)
assert.Equal(t, false, file.Changed(500, time))
})
t.Run("deleted", func(t *testing.T) {
file := &File{Photo: nil, FileType: "jpg", FileSize: 500, FileModified: time.Date(2019, 01, 15, 0, 0, 0, 0, time.UTC), DeletedAt: &deletedAt}
file := &File{Photo: nil, FileType: "jpg", FileSize: 500, ModTime: time.Date(2019, 01, 15, 0, 0, 0, 0, time.UTC).Unix(), DeletedAt: &deletedAt}
time := time.Date(2019, 01, 15, 0, 0, 0, 0, time.UTC)
assert.Equal(t, true, file.Changed(500, time))
})
@ -97,7 +97,7 @@ func TestFile_Create(t *testing.T) {
assert.Error(t, file.Create())
})
t.Run("file already exists", func(t *testing.T) {
file := &File{PhotoID: 123, FileType: "jpg", FileSize: 500, FileModified: time.Date(2019, 01, 15, 0, 0, 0, 0, time.UTC)}
file := &File{PhotoID: 123, FileType: "jpg", FileSize: 500, ModTime: time.Date(2019, 01, 15, 0, 0, 0, 0, time.UTC).Unix()}
file.Create()
assert.Error(t, file.Create())
})

View File

@ -119,7 +119,7 @@ func (t *Detector) loadModel() error {
return nil
}
log.Infof("nsfw: loading model from %s", txt.Quote(filepath.Base(t.modelPath)))
log.Infof("nsfw: loading %s", txt.Quote(filepath.Base(t.modelPath)))
// Load model
model, err := tf.LoadSavedModel(t.modelPath, t.modelTags, nil)

View File

@ -45,7 +45,7 @@ func (m *Files) Init() error {
// Ignore tests of a file requires indexing, file name must be relative to the originals path.
func (m *Files) Ignore(fileName string, modTime time.Time, rescan bool) bool {
timestamp := modTime.Round(time.Second).Unix()
timestamp := modTime.Unix()
m.mutex.Lock()
defer m.mutex.Unlock()

View File

@ -134,6 +134,12 @@ func (ind *Index) Start(opt IndexOptions) map[string]bool {
return result
}
done[fileName] = true
if !fs.FileExt.Media(fileName) {
return nil
}
mf, err := NewMediaFile(fileName)
if err != nil {
@ -141,8 +147,6 @@ func (ind *Index) Start(opt IndexOptions) map[string]bool {
return nil
}
done[fileName] = true
if ind.files.Ignore(relName, mf.modTime, opt.Rescan) {
return nil
}

View File

@ -84,7 +84,7 @@ func (ind *Index) MediaFile(m *MediaFile, o IndexOptions, originalName string) (
fileRoot, fileBase, filePath, fileName := m.PathNameInfo()
logName := txt.Quote(fileName)
fileSize, fileModified, err := m.Stat()
fileSize, modTime, err := m.Stat()
if err != nil {
err := fmt.Errorf("index: %s not found", logName)
@ -152,10 +152,10 @@ func (ind *Index) MediaFile(m *MediaFile, o IndexOptions, originalName string) (
} else {
photoQuery = entity.UnscopedDb().First(&photo, "id = ?", file.PhotoID)
fileChanged = file.Changed(fileSize, fileModified)
fileChanged = file.Changed(fileSize, modTime)
if fileChanged {
log.Debugf("index: file was modified (new size %d, old size %d, new date %s, old date %s)", fileSize, file.FileSize, fileModified, file.FileModified)
log.Debugf("index: file was modified (new size %d, old size %d, new timestamp %d, old timestamp %d)", fileSize, file.FileSize, modTime.Unix(), file.ModTime)
}
}
@ -525,10 +525,10 @@ func (ind *Index) MediaFile(m *MediaFile, o IndexOptions, originalName string) (
file.FileName = fileName
file.FileHash = fileHash
file.FileSize = fileSize
file.FileModified = fileModified
file.FileType = string(m.FileType())
file.FileMime = m.MimeType()
file.FileOrientation = m.Orientation()
file.ModTime = modTime.Unix()
if photoExists {
if err := photo.Save(); err != nil {

View File

@ -1,7 +1,6 @@
package query
import (
"fmt"
"strings"
"github.com/photoprism/photoprism/internal/entity"
@ -112,28 +111,19 @@ func IndexedFiles() (result FileMap, err error) {
type Files struct {
FileName string
Modified int64
ModTime int64
}
var files []Files
var sql string
sql := "SELECT file_name, mod_time FROM files"
switch DbDialect() {
case MySQL:
sql = "SELECT file_name, UNIX_TIMESTAMP(file_modified) AS modified FROM files"
case SQLite:
sql = "SELECT file_name, strftime('%s',file_modified) AS modified FROM files"
default:
return result, fmt.Errorf("unknown sql dialect: %s", DbDialect())
}
if err := Db().Raw(sql).Scan(&files).Error; err != nil {
if err := UnscopedDb().Raw(sql).Scan(&files).Error; err != nil {
return result, err
}
for _, row := range files {
result[row.FileName] = row.Modified
result[row.FileName] = row.ModTime
}
return result, err

View File

@ -112,6 +112,48 @@ var FileExt = FileExtensions{
".json": TypeJson,
}
func (m FileExtensions) Media(name string) bool {
if name == "" {
return false
}
ext := strings.ToLower(filepath.Ext(name))
fileType, ok := m[ext]
if !ok {
return false
}
switch fileType {
case TypeJpeg, TypePng, TypeGif, TypeTiff, TypeBitmap, TypeRaw, TypeHEIF, TypeMov, TypeMP4, TypeAvi:
return true
default:
return false
}
}
func (m FileExtensions) Sidecar(name string) bool {
if name == "" {
return false
}
ext := strings.ToLower(filepath.Ext(name))
fileType, ok := m[ext]
if !ok {
return false
}
switch fileType {
case TypeAAE, TypeXML, TypeYaml, TypeToml, TypeJson, TypeText, TypeMarkdown:
return true
default:
return false
}
}
func (m FileExtensions) Known(name string) bool {
if name == "" {
return false