directus

Форк
0
/
20210805B-change-image-metadata-structure.ts 
103 строки · 2.8 Кб
1
import { parseJSON } from '@directus/utils';
2
import type { Knex } from 'knex';
3

4
// Change image metadata structure to match the output from 'exifr'
5
export async function up(knex: Knex): Promise<void> {
6
	const files = await knex
7
		.select<{ id: number; metadata: string }[]>('id', 'metadata')
8
		.from('directus_files')
9
		.whereNotNull('metadata');
10

11
	for (const { id, metadata } of files) {
12
		let prevMetadata;
13

14
		try {
15
			prevMetadata = parseJSON(metadata);
16
		} catch {
17
			continue;
18
		}
19

20
		// Update only required if metadata has 'exif' data
21
		if (prevMetadata.exif) {
22
			// Get all data from 'exif' and rename the following keys:
23
			// - 'image' to 'ifd0'
24
			// - 'thumbnail to 'ifd1'
25
			// - 'interoperability' to 'interop'
26
			const newMetadata = prevMetadata.exif;
27

28
			if (newMetadata.image) {
29
				newMetadata.ifd0 = newMetadata.image;
30
				delete newMetadata.image;
31
			}
32

33
			if (newMetadata.thumbnail) {
34
				newMetadata.ifd1 = newMetadata.thumbnail;
35
				delete newMetadata.thumbnail;
36
			}
37

38
			if (newMetadata.interoperability) {
39
				newMetadata.interop = newMetadata.interoperability;
40
				delete newMetadata.interoperability;
41
			}
42

43
			if (prevMetadata.icc) {
44
				newMetadata.icc = prevMetadata.icc;
45
			}
46

47
			if (prevMetadata.iptc) {
48
				newMetadata.iptc = prevMetadata.iptc;
49
			}
50

51
			await knex('directus_files')
52
				.update({ metadata: JSON.stringify(newMetadata) })
53
				.where({ id });
54
		}
55
	}
56
}
57

58
export async function down(knex: Knex): Promise<void> {
59
	const files = await knex
60
		.select<{ id: number; metadata: string }[]>('id', 'metadata')
61
		.from('directus_files')
62
		.whereNotNull('metadata')
63
		.whereNot('metadata', '{}');
64

65
	for (const { id, metadata } of files) {
66
		const prevMetadata = parseJSON(metadata);
67

68
		// Update only required if metadata has keys other than 'icc' and 'iptc'
69
		if (Object.keys(prevMetadata).filter((key) => key !== 'icc' && key !== 'iptc').length > 0) {
70
			// Put all data under 'exif' and rename/move keys afterwards
71
			const newMetadata: { exif: Record<string, unknown>; icc?: unknown; iptc?: unknown } = { exif: prevMetadata };
72

73
			if (newMetadata.exif['ifd0']) {
74
				newMetadata.exif['image'] = newMetadata.exif['ifd0'];
75
				delete newMetadata.exif['ifd0'];
76
			}
77

78
			if (newMetadata.exif['ifd1']) {
79
				newMetadata.exif['thumbnail'] = newMetadata.exif['ifd1'];
80
				delete newMetadata.exif['ifd1'];
81
			}
82

83
			if (newMetadata.exif['interop']) {
84
				newMetadata.exif['interoperability'] = newMetadata.exif['interop'];
85
				delete newMetadata.exif['interop'];
86
			}
87

88
			if (newMetadata.exif['icc']) {
89
				newMetadata.icc = newMetadata.exif['icc'];
90
				delete newMetadata.exif['icc'];
91
			}
92

93
			if (newMetadata.exif['iptc']) {
94
				newMetadata.iptc = newMetadata.exif['iptc'];
95
				delete newMetadata.exif['iptc'];
96
			}
97

98
			await knex('directus_files')
99
				.update({ metadata: JSON.stringify(newMetadata) })
100
				.where({ id });
101
		}
102
	}
103
}
104

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

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

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

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