-
Notifications
You must be signed in to change notification settings - Fork 0
/
reko.js
123 lines (108 loc) · 2.68 KB
/
reko.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
const Airtable = require("airtable");
const AWS = require("aws-sdk");
const S3 = new AWS.S3();
const axios = require("axios");
// Initialize Airtable
Airtable.configure({
endpointUrl: "https://api.airtable.com",
apiKey: "key0aVfVmWLnBm0dC",
});
const base = Airtable.base("appWveOREcCzpb8yt");
// Initialize AWS
AWS.config.update({ region: "eu-west-2" });
const rekognition = new AWS.Rekognition();
let jobsCount = 0;
const JOBS_LIMIT = 20;
async function processVideos(videos) {
for (const record of videos) {
await processVideo(record);
}
}
async function processVideo(record) {
const id = record.id;
const attachment = record.get("video");
if (attachment && attachment[0] && attachment[0].url) {
const params = {
Bucket: "drpcrd-dashboard",
Key: `rek/${id}`,
Body: (await axios({ url: attachment[0].url, responseType: "stream" }))
.data,
};
const upload = await S3.upload(params).promise();
const rekognitionParams = {
Video: {
S3Object: {
Bucket: "drpcrd-dashboard",
Name: `rek/${id}`,
},
},
JobTag: `${id}`,
MinConfidence: 90,
};
while (jobsCount >= JOBS_LIMIT) {
// Wait for a bit before checking again
await new Promise((resolve) => setTimeout(resolve, 10000)); // 10 seconds
await checkJobs();
}
const rekognitionResponse = await rekognition
.startLabelDetection(rekognitionParams)
.promise();
jobsCount += 1;
base("Videos").update(
[
{
id: record.id,
fields: {
jobId: rekognitionResponse.JobId,
},
},
],
function (err, records) {
if (err) {
console.error(err);
return;
}
}
);
}
}
async function checkJobs() {
base("Videos")
.select({
view: "Grid view",
maxRecords: JOBS_LIMIT,
sort: [{ field: "jobId", direction: "desc" }],
})
.eachPage(
async function page(records, fetchNextPage) {
for (const record of records) {
const jobId = record.get("jobId");
if (jobId) {
const response = await rekognition
.getLabelDetection({ JobId: jobId })
.promise();
if (["SUCCEEDED", "FAILED"].includes(response.JobStatus)) {
jobsCount -= 1;
}
}
}
fetchNextPage();
},
function done(err) {
if (err) {
console.error(err);
}
}
);
}
base("Videos")
.select({
view: "Grid view",
})
.firstPage(function (err, records) {
if (err) {
console.error(err);
return;
}
processVideos(records);
});