From d788af3a2d117f274eb14d62e3e29aa7645004a7 Mon Sep 17 00:00:00 2001 From: kagahd Date: Fri, 23 Apr 2021 20:09:33 +0200 Subject: [PATCH 1/4] #267 support XMP tag 'subject' --- test/backend/assets/xmp/xmp_subject.jpg | Bin 0 -> 7909 bytes test/backend/assets/xmp/xmp_subject.json | 12 ++++++++++++ .../unit/model/threading/MetaDataLoader.spec.ts | 5 +++++ 3 files changed, 17 insertions(+) create mode 100644 test/backend/assets/xmp/xmp_subject.jpg create mode 100644 test/backend/assets/xmp/xmp_subject.json diff --git a/test/backend/assets/xmp/xmp_subject.jpg b/test/backend/assets/xmp/xmp_subject.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7dbe6dd25fba866ee58be9ab760fd710948dca55 GIT binary patch literal 7909 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 { expect(Utils.clone(data)).to.be.deep.equal(expected); }); + it('should load xmp section dc:subject into keywords', async () => { + const data = await MetadataLoader.loadPhotoMetadata(path.join(__dirname, '/../../../assets/xmp/xmp_subject.jpg')); + const expected = require(path.join(__dirname, '/../../../assets/xmp/xmp_subject.json')); + expect(Utils.clone(data)).to.be.deep.equal(expected); + }); it('should load jpg 2', async () => { const data = await MetadataLoader.loadPhotoMetadata(path.join(__dirname, '/../../../assets/old_photo.jpg')); From a4cb1188fe657219c94cfe8cea1dffaa43103185 Mon Sep 17 00:00:00 2001 From: kagahd Date: Sat, 24 Apr 2021 10:32:12 +0200 Subject: [PATCH 2/4] #267 add XMP section 'subject' to keywords --- src/backend/model/threading/MetadataLoader.ts | 6 +++++- test/backend/assets/xmp/xmp_subject.json | 14 +++++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/backend/model/threading/MetadataLoader.ts b/src/backend/model/threading/MetadataLoader.ts index a1aeab94..60b5b2d9 100644 --- a/src/backend/model/threading/MetadataLoader.ts +++ b/src/backend/model/threading/MetadataLoader.ts @@ -216,7 +216,11 @@ export class MetadataLoader { if (exif.Rating) { metadata.rating = (parseInt(exif.Rating.value, 10) as any); } - + if(exif.subject && exif.subject.value){ + for(let i=0; i < exif.subject.value.length; i++){ + metadata.keywords.push(exif.subject.value[i].value); + } + } if (exif.Orientation) { metadata.orientation = (parseInt(exif.Orientation.value as any, 10) as any); if (OrientationTypes.BOTTOM_LEFT < metadata.orientation) { diff --git a/test/backend/assets/xmp/xmp_subject.json b/test/backend/assets/xmp/xmp_subject.json index a2c1d2b7..219165cc 100644 --- a/test/backend/assets/xmp/xmp_subject.json +++ b/test/backend/assets/xmp/xmp_subject.json @@ -1,10 +1,22 @@ { + "cameraData": { + "ISO": 50, + "exposure": 0.007751937984496124, + "fStop": 2.4, + "focalLength": 4.32, + "make": "samsung", + "model": "SM-G975F" + }, + "creationDate": 1614703656000, + "fileSize": 7909, + "orientation": 1, + "rating": 50, + "Rating": 3, "keywords": [ "Max", "Spaß", "Yanik" ], - "Rating": 3, "size": { "height": 47, "width": 100 From bd3db9a3080db55f3c7bf72a1aa34cc4c1f3ec95 Mon Sep 17 00:00:00 2001 From: kagahd Date: Sat, 24 Apr 2021 16:11:44 +0200 Subject: [PATCH 3/4] #267 add XMP subject to keywords only if keyword is not yet exisiting --- src/backend/model/threading/MetadataLoader.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/backend/model/threading/MetadataLoader.ts b/src/backend/model/threading/MetadataLoader.ts index 60b5b2d9..9dc1aa1b 100644 --- a/src/backend/model/threading/MetadataLoader.ts +++ b/src/backend/model/threading/MetadataLoader.ts @@ -216,9 +216,11 @@ export class MetadataLoader { if (exif.Rating) { metadata.rating = (parseInt(exif.Rating.value, 10) as any); } - if(exif.subject && exif.subject.value){ + if(exif.subject && exif.subject.value){ for(let i=0; i < exif.subject.value.length; i++){ - metadata.keywords.push(exif.subject.value[i].value); + if(metadata.keywords.indexOf(exif.subject.value[i].value) == -1) { + metadata.keywords.push(exif.subject.value[i].value); + } } } if (exif.Orientation) { From f8b68e5c2c0cbdb13dbbd1ce2acfc55a3e670c79 Mon Sep 17 00:00:00 2001 From: kagahd Date: Sun, 25 Apr 2021 01:16:22 +0200 Subject: [PATCH 4/4] #267 add XMP 'subject' to 'keywords' with proper encoding --- src/backend/model/threading/MetadataLoader.ts | 10 +++++++--- test/backend/assets/test_png.json | 1 + test/backend/assets/xmp/xmp_subject.jpg | Bin 7909 -> 4709 bytes test/backend/assets/xmp/xmp_subject.json | 8 +++----- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/backend/model/threading/MetadataLoader.ts b/src/backend/model/threading/MetadataLoader.ts index 9dc1aa1b..ca83624b 100644 --- a/src/backend/model/threading/MetadataLoader.ts +++ b/src/backend/model/threading/MetadataLoader.ts @@ -216,10 +216,14 @@ export class MetadataLoader { if (exif.Rating) { metadata.rating = (parseInt(exif.Rating.value, 10) as any); } - if(exif.subject && exif.subject.value){ + if(exif.subject && exif.subject.value && exif.subject.value.length > 0){ + if(metadata.keywords == undefined) { + metadata.keywords = []; + } for(let i=0; i < exif.subject.value.length; i++){ - if(metadata.keywords.indexOf(exif.subject.value[i].value) == -1) { - metadata.keywords.push(exif.subject.value[i].value); + const kw = exif.subject.value[i].description; + if(metadata.keywords.indexOf(kw) == -1) { + metadata.keywords.push(kw); } } } diff --git a/test/backend/assets/test_png.json b/test/backend/assets/test_png.json index 5cc83c27..bc0d7b2c 100644 --- a/test/backend/assets/test_png.json +++ b/test/backend/assets/test_png.json @@ -20,6 +20,7 @@ } ], "fileSize": 4381, + "keywords": [], "orientation": 1, "size": { "height": 26, diff --git a/test/backend/assets/xmp/xmp_subject.jpg b/test/backend/assets/xmp/xmp_subject.jpg index 7dbe6dd25fba866ee58be9ab760fd710948dca55..a10038af186537c27afc4ac880b569718b8eb29c 100644 GIT binary patch delta 473 zcmaEA`&4Cum^$lT*NV(E1_n=0Ed~w-1_mAm21XVJMj(p|h#8@5){VAH8F@h>%nKm0 ztef96nldu=Gfh@w-o?zyz_qzV`~;&;<5%x5wa?zUB`ge?{M~(N>g=1Fzu)*h%_J~F zb>ZbJ|8GjN7o?sP{owrnA(!an1nwY4g~^+_&3H}pO!N$Nfi5XCQnH);ncHcyHILln zIXpU(Q+c!<6w-=I@(Zle63g<7GD}izl?;^Z6l_wGt%^&NvQm>vfSjU~G%KgXbSNt) z)6O@s!bTq?3S>_{&nq4cQ3K>fCgx>k!{rnpEQnrx6f?ovT~dpai!uvJGV}9*hJ%HI qT--p+3ag6Tg51=SM7zlo1yd$35DcXWe!%BH`JC8dcn~WP3St1U=%`-+ literal 7909 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