5TZPO2XG4EGASWQOWU6O26A63546YUJRR2MPXP5QCSRIJYZ3AYTAC
KMB6XE3KKWBF7VXM7UZX5EUONPRSQKMSGK2GJUOZRQWO77QUSP5AC
6KFVCGKKXDPZMNUP6ZN6M7MJQ25PDER42VV5FAY45OHJZWO4VEMQC
LJWOKWMFBXKZJ3TSNWBMD6SCJW7EEOTXQ3XBZIBUL55CEWYV2F7QC
ZRQFW3UNHIZLLXHXHK4EHVK74IN7RRGASB4WKYJAS2FJA5EHA2XAC
QX7XVNQYOTBDULUCLFRGSATHL7KWBSEV6QWNFY353S7ZIR6UGJWQC
MCPXLE6LIQRLQA2OBQSVIH4O3HAEZZWKPQMEDERPBHN6IVOAVXVAC
UW4WSPWD7TVQWURMTLRNW6LKVFLUVQT7NBUP5A4WMAIVHSLUPH7AC
MU3GBWGKLME6ANHMJ4NL7J23UJQTNOYL57ATZ2EPKONKAJMDWVHAC
XEYT3JUSCIZ6QFZJCZTT7UXA5ROA4LGQGOGCBFLRPG5MY4MVPC6AC
6Q2LBYYTS5Z67TKMOMJRBRST5UIOW3CGRSDGCDQBO3F3DNNPVGIQC
DJCUBG53FVIUI6NVFWTBW36JEINQABLIK5FMB3VNS3MYFDXCKMDQC
HOTFGCPMWQATBEXUZXAAW7TILKKQJGJMLAF72URDK4H632C3JXEQC
L3PX32UXE2SC4JK3VXLL654DHBZGVXSBLZRQIGUIB4RIXEVHU5IQC
7CRKZALXJV7SBMSXU44VATIRC6XBWNRVDZISX3XKGJAZNXUZOBKAC
UWXG66NAOSBY6SU4IWCOAKXZDUVAHG4WCTX3W53LXV5QJURTWVPQC
R4THF7FOB3LE7JE7DMA5UL6PJIYZMNUWH6TLUKDHNB2X47V4MAEQC
TOLGMXUXRC74FQHKSAFLRNEG44GPLBMORKRDPU35EB2F424AN5QAC
}
div.metadata h3{
display: block;
font-size: 1em;
line-height: 1.2em;
font-weight: 500;
width: 95%;
float: none;
text-align: left;
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
text-transform: uppercase;
padding-top:2em;
margin-bottom: 2em;
border-bottom: 1px solid
box-shadow: 0 4px 5px 0 rgba(0,0,0,0.14), 0 1px 10px 0 rgba(0,0,0,0.12), 0 2px 4px -1px rgba(0,0,0,0.2);
box-shadow: 0 4px 5px 0 rgba(0, 0, 0, 0.14), 0 1px 10px 0 rgba(0, 0, 0, 0.12), 0 2px 4px -1px rgba(0, 0, 0, 0.2);
transition: height 0.3s linear 0s, padding 0.3s linear 0s;
transition: box-shadow 250ms;
}
.header-notFixed {
position: relative;
color: @header-titlecolor;
display: none;
z-index: 1000;
width: 100%;
height: 54px;
box-shadow: 0 4px 5px 0 rgba(0, 0, 0, 0.14), 0 1px 10px 0 rgba(0, 0, 0, 0.12), 0 2px 4px -1px rgba(0, 0, 0, 0.2);
$.each(m, function(key, value) {
if (isEmpty(isEmpty) == false) {
// check geo data
if (b && key.startsWith('GPS')) {
// TODO ???
// if (key == "GPSLatitude")
// value = Number.parseFloat(Math.abs(value).toFixed(5));
// if (key == "GPSLongitude")
// value = Number.parseFloat(Math.abs(value).toFixed(5));
// console.log(key, value);
_geoDat[key.toLowerCase()] = value;
if (isEmpty(isEmpty) == false) {
$.each(m, function(key, item) {
if (typeof item === 'object') {
s = decamelize(key, " ");
_this.addPhotodata({ label: s, deep: 0, value: null });
$.each(item, function(key, value) {
s = decamelize(key, " ");
_this.addPhotodata({ label: s, deep: 1, value: value });
if (key.startsWith('GPS')) {
_geoDat[key.toLowerCase()] = value;
}
})
Metadata.prototype.addPhotodata = function(key, value) {
if (isEmpty(key) == false && isEmpty(value) == false)
this.photodata[key] = value;
Metadata.prototype.addPhotodata = function(obj) {
// { label: s, deep: 0, value: s }
if (isEmpty(obj)) return;
if (isEmpty(obj.label) == false) {
this.photodata.push(obj)
}
$.each(this.photodata, function(key, value) {
t.html += '<label>' + key + "</label><span>" + value + '</span>'
$.each(this.photodata, function(item) {
if (this.deep === 0)
t.html += '<h3>' + this.label + "</h3>"
if (this.deep === 1 && this.value)
t.html += '<label> - ' + this.label + "</label><span>" + this.value + '</span>'
<header id="pagetop-home">
<h1>
<a href="{{relative gallery.home.url}}">
{{#if settings.logo }}
<img src="{{settings.logo}}" class="avatar"></img>
{{/if}}
<span class="appname">{{{gallery.title}}}</span>
</a>
</h1>
{{#compare album.depth '==' 0}}
<span id="pageinfo" class="pageinfo">{{album.summary}}</span>
{{/compare}}
<header id="pagetop-home">
<div class="header-fixed">
<h1>
<a href="{{relative gallery.home.url}}">
{{#if settings.logo }}
<img src="{{settings.logo}}" class="avatar"></img>
{{/if}}
<span class="appname">{{{gallery.title}}}</span>
</a>
</h1>
{{#compare album.depth '==' 0}}
<span id="pageinfo" class="pageinfo">{{album.summary}}</span>
{{/compare}}
</div>
<div class="header-notFixed">
<p>{{{gallery.title}}}</p>
</div>
attr['data-metadata'] = metafile
} else {
if (config.writeMetaData && config.writeMetaData.target) {
metafile = writeMetadata(meta.all, config)
if (metafile != null) {
attr['data-metadata'] = metafile
}
attr['data-metafile'] = metafile
}
}
// 2nd check if we have a to create the metadata file
if (metafile == null && config.writeMetaData && config.writeMetaData.target) {
if (config.writeMetaData && config.writeMetaData.target) {
metafile = writeMetadata(meta.all, config)
if (metafile != null) {
attr['data-metafile'] = metafile
# Information for helpers
```js
...
class Metadata {
constructor(exiftool, picasa, opts) {
// standardise metadata
this.date = getDate(exiftool)
this.caption = caption(exiftool)
this.keywords = keywords(exiftool, picasa)
this.video = video(exiftool)
this.animated = animated(exiftool)
this.rating = rating(exiftool)
this.favourite = favourite(picasa)
const size = dimensions(exiftool)
this.width = size.width
this.height = size.height
this.exif = opts ? (opts.embedExif ? exiftool.EXIF : undefined) : undefined
////////////////////////////////////////////////////////
this.all = exiftool // <--- Add this to get all metadata
////////////////////////////////////////////////////////
// metadata could also include fields like
// - lat = 51.5
// - long = 0.12
// - country = "England"
// - city = "London"
// - aperture = 1.8
}
...
}
```
**fotoMeta.js**: used with mediaitem to add the data section
**album.hbs**
To use the metadata layer, add the css and javascript files to the main template.
```html
<head>
.....
## all css files
<link rel="stylesheet prefetch" href="{{relative 'public/lightgallery/css/lg-exif.min.css'}}" />
.....
</head>
<body>
## all javascripts
....
<script src="{{relative 'public/lightgallery/js/lg-metadata.js'}}"></script>
</body>
```
**foldertree.js**: experimental - build navigation tree
---
**Default**
If no --theme-settings are used the metadataview shows all form the "data-*" attributes.
```nodejs
config.json
{
"input": "PATH TO OUTPUT",
"output": "./fotobuch",
"title": "Fotobuch AUTOR",
"include-raw-photos": false,
"photo-quality": 90,
"thumb-size": 360,
"large-size": 1200,
"embed-exif": true,
"sort-albums-by": "title",
"sort-albums-direction": "desc",
"theme-path": "PROJECTFOLDER/theme-cards-flow/theme",
"theme-settings": "PATH TO PROPERTYFILE.json"
"cleanup": true
}
```
---
**Copy Metadata.json files from the photo album folder**
If "**--theme-settings**" are used and the settings holds a "**copyMetaFiles**" section,
all metafile.json files will be copied to the media folder. For this case the
photo metafile.json will be used to render the metaview data. Optional all additional
"data-*" attributes will be rendered too.
```nodejs
## config.json
{
....
## use the theme-settings
"theme-settings": "PATH TO THEME-SETTINGS.JSON",
...
}
## theme-settings.json
{
....
"copyMetaFiles": {
"source": "PATH TO PHOTOS FOLDER",
"target": "PATH TO MEDIAFOLDER/media/large/"
},
...
}
```
---
**Copy / Create Metadata.json data from the photo album folder**
```nodejs
## config.json
{
....
## use the theme-settings
"theme-settings": "PATH TO THEME-SETTINGS.JSON",
...
}
## theme-settings.json
{
....
"copyMetaFiles": {
"source": "PATH TO PHOTOS FOLDER",
"target": "PATH TO MEDIAFOLDER/media/large/"
},
"writeMetaData": {
"target": "/Users/petsie1612/ips_apps/webfotos/fbtemp2/media/large/",
"linkpath": "media/large/",
"metatags": {
"Allgemein": {
"Dateiname": "File.Filename",
"Ablage": "File.Directory",
"Beschreibung": "Image.Description",
"Fotograf": "Author.Artist"
},
"Foto": {
"Fotoapperat": "EXIF.Model",
"Marke": "EXIF.Make",
"Bildgröße": "Composite.ImageSize",
"Auflösung": "Composite.Megapixels",
"Blende": "Composite.ShutterSpeed",
"Belichtung": "Composite.LightValue",
"ISO": "EXIF.ISO",
"Focus": "EXIF.FocalLength",
"Belichtungsdauer": "EXIF.ExposureTime"
},
"Geografie": {
"Datum/Uhrzeit": "Composite.GPSDateTime",
"Breitengrad": "Composite.GPSLatitude",
"Längengrad": "Composite.GPSLongitude",
"Höhe": "Composite.GPSAltitude",
"Land": "Composite.Country",
"Stadt": "Composite.City"
}
}
}
}
```
---
# Information for helpers
---
**cover.js***: checks home or album / galllery cover
**foldertree.js**: experimental - build navigation tree