directus

Форк
0
/
parse-image-metadata.ts 
84 строки · 2.2 Кб
1
const IPTC_ENTRY_TYPES = new Map([
2
	[0x78, 'caption'],
3
	[0x6e, 'credit'],
4
	[0x19, 'keywords'],
5
	[0x37, 'dateCreated'],
6
	[0x50, 'byline'],
7
	[0x55, 'bylineTitle'],
8
	[0x7a, 'captionWriter'],
9
	[0x69, 'headline'],
10
	[0x74, 'copyright'],
11
	[0x0f, 'category'],
12
]);
13

14
const IPTC_ENTRY_MARKER = Buffer.from([0x1c, 0x02]);
15

16
export function parseIptc(buffer: Buffer): Record<string, unknown> {
17
	if (!Buffer.isBuffer(buffer)) return {};
18

19
	const iptc: Record<string, any> = {};
20
	let lastIptcEntryPos = buffer.indexOf(IPTC_ENTRY_MARKER);
21

22
	while (lastIptcEntryPos !== -1) {
23
		lastIptcEntryPos = buffer.indexOf(IPTC_ENTRY_MARKER, lastIptcEntryPos + IPTC_ENTRY_MARKER.byteLength);
24

25
		const iptcBlockTypePos = lastIptcEntryPos + IPTC_ENTRY_MARKER.byteLength;
26
		const iptcBlockSizePos = iptcBlockTypePos + 1;
27
		const iptcBlockDataPos = iptcBlockSizePos + 2;
28

29
		const iptcBlockType = buffer.readUInt8(iptcBlockTypePos);
30
		const iptcBlockSize = buffer.readUInt16BE(iptcBlockSizePos);
31

32
		if (!IPTC_ENTRY_TYPES.has(iptcBlockType)) {
33
			continue;
34
		}
35

36
		const iptcBlockTypeId = IPTC_ENTRY_TYPES.get(iptcBlockType);
37
		const iptcData = buffer.subarray(iptcBlockDataPos, iptcBlockDataPos + iptcBlockSize).toString();
38

39
		if (iptcBlockTypeId) {
40
			if (iptc[iptcBlockTypeId] == null) {
41
				iptc[iptcBlockTypeId] = iptcData;
42
			} else if (Array.isArray(iptc[iptcBlockTypeId])) {
43
				iptc[iptcBlockTypeId].push(iptcData);
44
			} else {
45
				iptc[iptcBlockTypeId] = [iptc[iptcBlockTypeId], iptcData];
46
			}
47
		}
48
	}
49

50
	return iptc;
51
}
52

53
export function parseXmp(buffer: Buffer): Record<string, unknown> {
54
	const xmp: Record<string, unknown> = {};
55

56
	['title', 'description', 'rights', 'creator', 'subject'].forEach((x) => {
57
		const tagRegex = new RegExp(`<dc:${x}>(.*?)</dc:${x}>`, 'smig'),
58
			tagMatches = tagRegex.exec(buffer.toString());
59

60
		if (!tagMatches || tagMatches.length === 0) {
61
			return;
62
		}
63

64
		const value = tagMatches[1]?.trim();
65

66
		if (value?.toLowerCase().indexOf('<rdf:bag>') === 0) {
67
			const r = new RegExp('<rdf:li>(.*?)</rdf:li>', 'smig');
68
			let match = r.exec(value);
69
			const result = [];
70

71
			while (match) {
72
				result.push(match[1]);
73

74
				match = r.exec(value);
75
			}
76

77
			xmp[x] = result;
78
		} else {
79
			xmp[x] = value?.replace(/<[^>]*>?/gm, '').trim();
80
		}
81
	});
82

83
	return xmp;
84
}
85

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.