@@ -41,14 +41,30 @@ function analyzeFaces (gcsUri) {
41
41
. then ( ( results ) => {
42
42
// Gets faces
43
43
const faces = results [ 0 ] . annotationResults [ 0 ] . faceAnnotations ;
44
- console . log ( 'Faces:' ) ;
45
44
faces . forEach ( ( face , faceIdx ) => {
46
- console . log ( 'Thumbnail size:' , face . thumbnail . length ) ;
45
+ console . log ( `Face #${ faceIdx } ` ) ;
46
+ console . log ( `\tThumbnail size: ${ face . thumbnail . length } ` ) ;
47
47
face . segments . forEach ( ( segment , segmentIdx ) => {
48
- console . log ( `Face #${ faceIdx } , appearance #${ segmentIdx } :` ) ;
49
- console . log ( `\tStart: ${ segment . startTimeOffset / 1e6 } s` ) ;
50
- console . log ( `\tEnd: ${ segment . endTimeOffset / 1e6 } s` ) ;
48
+ segment = segment . segment ;
49
+ if ( segment . startTimeOffset . seconds === undefined ) {
50
+ segment . startTimeOffset . seconds = 0 ;
51
+ }
52
+ if ( segment . startTimeOffset . nanos === undefined ) {
53
+ segment . startTimeOffset . nanos = 0 ;
54
+ }
55
+ if ( segment . endTimeOffset . seconds === undefined ) {
56
+ segment . endTimeOffset . seconds = 0 ;
57
+ }
58
+ if ( segment . endTimeOffset . nanos === undefined ) {
59
+ segment . endTimeOffset . nanos = 0 ;
60
+ }
61
+ console . log ( `\tAppearance #${ segmentIdx } :` ) ;
62
+ console . log ( `\t\tStart: ${ segment . startTimeOffset . seconds } ` +
63
+ `.${ ( segment . startTimeOffset . nanos / 1e6 ) . toFixed ( 0 ) } s` ) ;
64
+ console . log ( `\t\tEnd: ${ segment . endTimeOffset . seconds } .` +
65
+ `${ ( segment . endTimeOffset . nanos / 1e6 ) . toFixed ( 0 ) } s` ) ;
51
66
} ) ;
67
+ console . log ( `\tLocations:` ) ;
52
68
} ) ;
53
69
} )
54
70
. catch ( ( err ) => {
@@ -63,7 +79,9 @@ function analyzeLabelsGCS (gcsUri) {
63
79
const Video = require ( '@google-cloud/video-intelligence' ) ;
64
80
65
81
// Instantiates a client
66
- const video = Video ( ) ;
82
+ const video = Video ( {
83
+ servicePath : `videointelligence.googleapis.com`
84
+ } ) ;
67
85
68
86
// The GCS filepath of the video to analyze
69
87
// const gcsUri = 'gs://my-bucket/my-video.mp4';
@@ -81,24 +99,32 @@ function analyzeLabelsGCS (gcsUri) {
81
99
return operation . promise ( ) ;
82
100
} )
83
101
. then ( ( results ) => {
84
- // Gets labels
85
- const labels = results [ 0 ] . annotationResults [ 0 ] . labelAnnotations ;
86
- console . log ( 'Labels:' ) ;
102
+ // Gets annotations for video
103
+ const annotations = results [ 0 ] . annotationResults [ 0 ] ;
104
+
105
+ const labels = annotations . segmentLabelAnnotations ;
87
106
labels . forEach ( ( label ) => {
88
- console . log ( `Label ${ label . description } occurs at:` ) ;
89
- const isEntireVideo = label . locations . some ( ( location ) =>
90
- location . segment . startTimeOffset . toNumber ( ) === - 1 &&
91
- location . segment . endTimeOffset . toNumber ( ) === - 1
92
- ) ;
93
-
94
- if ( isEntireVideo ) {
95
- console . log ( `\tEntire video` ) ;
96
- } else {
97
- label . locations . forEach ( ( location ) => {
98
- console . log ( `\tStart: ${ location . segment . startTimeOffset / 1e6 } s` ) ;
99
- console . log ( `\tEnd: ${ location . segment . endTimeOffset / 1e6 } s` ) ;
100
- } ) ;
101
- }
107
+ console . log ( `Label ${ label . entity . description } occurs at:` ) ;
108
+ label . segments . forEach ( ( segment ) => {
109
+ let time = segment . segment ;
110
+ if ( time . startTimeOffset . seconds === undefined ) {
111
+ time . startTimeOffset . seconds = 0 ;
112
+ }
113
+ if ( time . startTimeOffset . nanos === undefined ) {
114
+ time . startTimeOffset . nanos = 0 ;
115
+ }
116
+ if ( time . endTimeOffset . seconds === undefined ) {
117
+ time . endTimeOffset . seconds = 0 ;
118
+ }
119
+ if ( time . endTimeOffset . nanos === undefined ) {
120
+ time . endTimeOffset . nanos = 0 ;
121
+ }
122
+ console . log ( `\tStart: ${ time . startTimeOffset . seconds } ` +
123
+ `.${ ( time . startTimeOffset . nanos / 1e6 ) . toFixed ( 0 ) } s` ) ;
124
+ console . log ( `\tEnd: ${ time . endTimeOffset . seconds } .` +
125
+ `${ ( time . endTimeOffset . nanos / 1e6 ) . toFixed ( 0 ) } s` ) ;
126
+ console . log ( `\tConfidence: ${ segment . confidence } ` ) ;
127
+ } ) ;
102
128
} ) ;
103
129
} )
104
130
. catch ( ( err ) => {
@@ -137,24 +163,32 @@ function analyzeLabelsLocal (path) {
137
163
return operation . promise ( ) ;
138
164
} )
139
165
. then ( ( results ) => {
140
- // Gets labels for first video
141
- const labels = results [ 0 ] . annotationResults [ 0 ] . labelAnnotations ;
142
- console . log ( 'Labels:' ) ;
166
+ // Gets annotations for video
167
+ const annotations = results [ 0 ] . annotationResults [ 0 ] ;
168
+
169
+ const labels = annotations . segmentLabelAnnotations ;
143
170
labels . forEach ( ( label ) => {
144
- console . log ( `Label ${ label . description } occurs at:` ) ;
145
- const isEntireVideo = label . locations . some ( ( location ) =>
146
- location . segment . startTimeOffset . toNumber ( ) === - 1 &&
147
- location . segment . endTimeOffset . toNumber ( ) === - 1
148
- ) ;
149
-
150
- if ( isEntireVideo ) {
151
- console . log ( `\tEntire video` ) ;
152
- } else {
153
- label . locations . forEach ( ( location ) => {
154
- console . log ( `\tStart: ${ location . segment . startTimeOffset / 1e6 } s` ) ;
155
- console . log ( `\tEnd: ${ location . segment . endTimeOffset / 1e6 } s` ) ;
156
- } ) ;
157
- }
171
+ console . log ( `Label ${ label . entity . description } occurs at:` ) ;
172
+ label . segments . forEach ( ( segment ) => {
173
+ let time = segment . segment ;
174
+ if ( time . startTimeOffset . seconds === undefined ) {
175
+ time . startTimeOffset . seconds = 0 ;
176
+ }
177
+ if ( time . startTimeOffset . nanos === undefined ) {
178
+ time . startTimeOffset . nanos = 0 ;
179
+ }
180
+ if ( time . endTimeOffset . seconds === undefined ) {
181
+ time . endTimeOffset . seconds = 0 ;
182
+ }
183
+ if ( time . endTimeOffset . nanos === undefined ) {
184
+ time . endTimeOffset . nanos = 0 ;
185
+ }
186
+ console . log ( `\tStart: ${ time . startTimeOffset . seconds } ` +
187
+ `.${ ( time . startTimeOffset . nanos / 1e6 ) . toFixed ( 0 ) } s` ) ;
188
+ console . log ( `\tEnd: ${ time . endTimeOffset . seconds } .` +
189
+ `${ ( time . endTimeOffset . nanos / 1e6 ) . toFixed ( 0 ) } s` ) ;
190
+ console . log ( `\tConfidence: ${ segment . confidence } ` ) ;
191
+ } ) ;
158
192
} ) ;
159
193
} )
160
194
. catch ( ( err ) => {
@@ -195,9 +229,29 @@ function analyzeShots (gcsUri) {
195
229
console . log ( `The entire video is one shot.` ) ;
196
230
} else {
197
231
shotChanges . forEach ( ( shot , shotIdx ) => {
198
- console . log ( `Shot ${ shotIdx } occurs from:` ) ;
199
- console . log ( `\tStart: ${ shot . startTimeOffset / 1e6 } s` ) ;
200
- console . log ( `\tEnd: ${ shot . endTimeOffset / 1e6 } s` ) ;
232
+ console . log ( `Scene ${ shotIdx } occurs from:` ) ;
233
+ if ( shot . startTimeOffset === undefined ) {
234
+ shot . startTimeOffset = { } ;
235
+ }
236
+ if ( shot . endTimeOffset === undefined ) {
237
+ shot . endTimeOffset = { } ;
238
+ }
239
+ if ( shot . startTimeOffset . seconds === undefined ) {
240
+ shot . startTimeOffset . seconds = 0 ;
241
+ }
242
+ if ( shot . startTimeOffset . nanos === undefined ) {
243
+ shot . startTimeOffset . nanos = 0 ;
244
+ }
245
+ if ( shot . endTimeOffset . seconds === undefined ) {
246
+ shot . endTimeOffset . seconds = 0 ;
247
+ }
248
+ if ( shot . endTimeOffset . nanos === undefined ) {
249
+ shot . endTimeOffset . nanos = 0 ;
250
+ }
251
+ console . log ( `\tStart: ${ shot . startTimeOffset . seconds } ` +
252
+ `.${ ( shot . startTimeOffset . nanos / 1e6 ) . toFixed ( 0 ) } s` ) ;
253
+ console . log ( `\tEnd: ${ shot . endTimeOffset . seconds } .` +
254
+ `${ ( shot . endTimeOffset . nanos / 1e6 ) . toFixed ( 0 ) } s` ) ;
201
255
} ) ;
202
256
}
203
257
} )
@@ -220,7 +274,7 @@ function analyzeSafeSearch (gcsUri) {
220
274
221
275
const request = {
222
276
inputUri : gcsUri ,
223
- features : [ 'SAFE_SEARCH_DETECTION ' ]
277
+ features : [ 'EXPLICIT_CONTENT_DETECTION ' ]
224
278
} ;
225
279
226
280
// Human-readable likelihoods
@@ -235,15 +289,21 @@ function analyzeSafeSearch (gcsUri) {
235
289
} )
236
290
. then ( ( results ) => {
237
291
// Gets unsafe content
238
- const safeSearchResults = results [ 0 ] . annotationResults [ 0 ] . safeSearchAnnotations ;
239
- console . log ( 'Safe search results:' ) ;
240
- safeSearchResults . forEach ( ( result ) => {
241
- console . log ( `Time: ${ result . timeOffset / 1e6 } s` ) ;
242
- console . log ( `\tAdult: ${ likelihoods [ result . adult ] } ` ) ;
243
- console . log ( `\tSpoof: ${ likelihoods [ result . spoof ] } ` ) ;
244
- console . log ( `\tMedical: ${ likelihoods [ result . medical ] } ` ) ;
245
- console . log ( `\tViolent: ${ likelihoods [ result . violent ] } ` ) ;
246
- console . log ( `\tRacy: ${ likelihoods [ result . racy ] } ` ) ;
292
+ const explicitContentResults = results [ 0 ] . annotationResults [ 0 ] . explicitAnnotation ;
293
+ console . log ( 'Explicit annotation results:' ) ;
294
+ explicitContentResults . frames . forEach ( ( result ) => {
295
+ if ( result . timeOffset === undefined ) {
296
+ result . timeOffset = { } ;
297
+ }
298
+ if ( result . timeOffset . seconds === undefined ) {
299
+ result . timeOffset . seconds = 0 ;
300
+ }
301
+ if ( result . timeOffset . nanos === undefined ) {
302
+ result . timeOffset . nanos = 0 ;
303
+ }
304
+ console . log ( `\tTime: ${ result . timeOffset . seconds } ` +
305
+ `.${ ( result . timeOffset . nanos / 1e6 ) . toFixed ( 0 ) } s` ) ;
306
+ console . log ( `\t\tPornography liklihood: ${ likelihoods [ result . pornographyLikelihood ] } ` ) ;
247
307
} ) ;
248
308
} )
249
309
. catch ( ( err ) => {
@@ -280,7 +340,7 @@ require(`yargs`) // eslint-disable-line
280
340
)
281
341
. command (
282
342
`safe-search <gcsUri>` ,
283
- `Detects adult content in a video stored in Google Cloud Storage.` ,
343
+ `Detects explicit content in a video stored in Google Cloud Storage.` ,
284
344
{ } ,
285
345
( opts ) => analyzeSafeSearch ( opts . gcsUri )
286
346
)
0 commit comments