-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathopenapi.yaml
More file actions
742 lines (700 loc) · 17.1 KB
/
openapi.yaml
File metadata and controls
742 lines (700 loc) · 17.1 KB
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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
openapi: 3.0.3
info:
title: FFprobe API
description: |
A comprehensive REST API for media file analysis using FFmpeg/FFprobe.
This API provides endpoints for:
- Media file analysis and probing
- Video quality analysis with VMAF, PSNR, SSIM metrics
- HLS manifest analysis and validation
- Report generation in multiple formats
- Cloud storage integration
- AI-powered analysis insights
## Authentication
The API supports multiple authentication methods:
- API Key authentication via `X-API-Key` header
- JWT Bearer token authentication
- Basic authentication for legacy systems
## Rate Limiting
Rate limits are enforced per API key/user:
- 60 requests per minute
- 1000 requests per hour
- 10000 requests per day
## File Upload
Maximum file size: 50GB
Supported formats: All FFmpeg supported formats
version: "2.0.0"
contact:
name: FFprobe API Support
url: https://github.com/rendiffdev/rendiff-probe
email: dev@rendiff.dev
license:
name: MIT
url: https://opensource.org/licenses/MIT
servers:
- url: http://localhost:8080/api/v1
description: Local development server
security:
- ApiKeyAuth: []
- BearerAuth: []
paths:
/health:
get:
summary: Health check
description: Check the health status of the API service
operationId: healthCheck
tags:
- System
responses:
'200':
description: Service is healthy
content:
application/json:
schema:
$ref: '#/components/schemas/HealthResponse'
'503':
description: Service is unhealthy
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
/auth/login:
post:
summary: Login
description: Authenticate user and get JWT token
operationId: login
tags:
- Authentication
security: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/LoginRequest'
responses:
'200':
description: Login successful
content:
application/json:
schema:
$ref: '#/components/schemas/LoginResponse'
'401':
description: Invalid credentials
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
/probe/file:
post:
summary: Analyze media file
description: Analyze a media file using FFprobe
operationId: probeFile
tags:
- Analysis
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ProbeFileRequest'
responses:
'200':
description: Analysis started
content:
application/json:
schema:
$ref: '#/components/schemas/AnalysisResponse'
'400':
description: Invalid request
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
/probe/status/{id}:
get:
summary: Get analysis status
description: Get the status of a media analysis job
operationId: getAnalysisStatus
tags:
- Analysis
parameters:
- name: id
in: path
required: true
description: Analysis ID
schema:
type: string
responses:
'200':
description: Analysis status retrieved
content:
application/json:
schema:
$ref: '#/components/schemas/AnalysisStatus'
'404':
description: Analysis not found
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
/probe/hls:
post:
summary: Analyze HLS playlist
description: Analyze an HLS playlist and its segments
operationId: analyzeHLS
tags:
- HLS
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/HLSAnalysisRequest'
responses:
'200':
description: HLS analysis started
content:
application/json:
schema:
$ref: '#/components/schemas/AnalysisResponse'
/probe/compare:
post:
summary: Compare video quality
description: Compare quality between reference and distorted videos
operationId: compareQuality
tags:
- Quality
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/QualityComparisonRequest'
responses:
'200':
description: Quality comparison started
content:
application/json:
schema:
$ref: '#/components/schemas/AnalysisResponse'
/probe/report:
post:
summary: Generate analysis report
description: Generate a report from analysis results in various formats
operationId: generateReport
tags:
- Reports
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ReportRequest'
responses:
'200':
description: Report generation started
content:
application/json:
schema:
$ref: '#/components/schemas/ReportResponse'
/storage/upload:
post:
summary: Upload file to storage
description: Upload a file to configured cloud storage
operationId: uploadFile
tags:
- Storage
requestBody:
required: true
content:
multipart/form-data:
schema:
type: object
properties:
file:
type: string
format: binary
description: File to upload
responses:
'200':
description: File uploaded successfully
content:
application/json:
schema:
$ref: '#/components/schemas/UploadResponse'
/storage/download/{key}:
get:
summary: Download file from storage
description: Download a file from storage by key
operationId: downloadFile
tags:
- Storage
parameters:
- name: key
in: path
required: true
description: File key in storage
schema:
type: string
responses:
'200':
description: File content
content:
application/octet-stream:
schema:
type: string
format: binary
/ask:
post:
summary: Ask AI about analysis
description: Ask AI-powered questions about analysis results
operationId: askAI
tags:
- AI
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/AIQuestionRequest'
responses:
'200':
description: AI response
content:
application/json:
schema:
$ref: '#/components/schemas/AIResponse'
components:
securitySchemes:
ApiKeyAuth:
type: apiKey
in: header
name: X-API-Key
BearerAuth:
type: http
scheme: bearer
bearerFormat: JWT
schemas:
HealthResponse:
type: object
properties:
status:
type: string
enum: [healthy, unhealthy]
service:
type: string
version:
type: string
database:
type: string
uptime:
type: string
required:
- status
- service
- version
ErrorResponse:
type: object
properties:
error:
type: string
message:
type: string
code:
type: integer
timestamp:
type: string
format: date-time
request_id:
type: string
required:
- error
- message
LoginRequest:
type: object
properties:
username:
type: string
password:
type: string
required:
- username
- password
LoginResponse:
type: object
properties:
token:
type: string
refresh_token:
type: string
expires_in:
type: integer
user:
$ref: '#/components/schemas/User'
required:
- token
- expires_in
User:
type: object
properties:
id:
type: string
username:
type: string
email:
type: string
role:
type: string
created_at:
type: string
format: date-time
ProbeFileRequest:
type: object
properties:
file_path:
type: string
description: Path to the media file
url:
type: string
description: URL to the media file (alternative to file_path)
options:
$ref: '#/components/schemas/AnalysisOptions'
anyOf:
- required: [file_path]
- required: [url]
AnalysisOptions:
type: object
properties:
include_streams:
type: boolean
default: true
include_format:
type: boolean
default: true
include_chapters:
type: boolean
default: false
show_entries:
type: string
description: FFprobe show_entries parameter
timeout:
type: integer
description: Analysis timeout in seconds
default: 300
AnalysisResponse:
type: object
properties:
analysis_id:
type: string
status:
type: string
enum: [pending, processing, completed, failed]
message:
type: string
created_at:
type: string
format: date-time
required:
- analysis_id
- status
AnalysisStatus:
type: object
properties:
analysis_id:
type: string
status:
type: string
enum: [pending, processing, completed, failed]
progress:
type: integer
minimum: 0
maximum: 100
result:
$ref: '#/components/schemas/AnalysisResult'
error:
type: string
created_at:
type: string
format: date-time
updated_at:
type: string
format: date-time
required:
- analysis_id
- status
- progress
AnalysisResult:
type: object
properties:
format:
$ref: '#/components/schemas/FormatInfo'
streams:
type: array
items:
$ref: '#/components/schemas/StreamInfo'
chapters:
type: array
items:
$ref: '#/components/schemas/ChapterInfo'
FormatInfo:
type: object
properties:
filename:
type: string
nb_streams:
type: integer
nb_programs:
type: integer
format_name:
type: string
format_long_name:
type: string
start_time:
type: string
duration:
type: string
size:
type: string
bit_rate:
type: string
probe_score:
type: integer
tags:
type: object
additionalProperties:
type: string
StreamInfo:
type: object
properties:
index:
type: integer
codec_name:
type: string
codec_long_name:
type: string
profile:
type: string
codec_type:
type: string
codec_time_base:
type: string
codec_tag_string:
type: string
codec_tag:
type: string
width:
type: integer
height:
type: integer
coded_width:
type: integer
coded_height:
type: integer
has_b_frames:
type: integer
sample_aspect_ratio:
type: string
display_aspect_ratio:
type: string
pix_fmt:
type: string
level:
type: integer
color_range:
type: string
color_space:
type: string
color_transfer:
type: string
color_primaries:
type: string
chroma_location:
type: string
field_order:
type: string
refs:
type: integer
r_frame_rate:
type: string
avg_frame_rate:
type: string
time_base:
type: string
start_pts:
type: integer
start_time:
type: string
duration_ts:
type: integer
duration:
type: string
bit_rate:
type: string
bits_per_raw_sample:
type: string
nb_frames:
type: string
tags:
type: object
additionalProperties:
type: string
ChapterInfo:
type: object
properties:
id:
type: integer
time_base:
type: string
start:
type: integer
start_time:
type: string
end:
type: integer
end_time:
type: string
tags:
type: object
additionalProperties:
type: string
HLSAnalysisRequest:
type: object
properties:
manifest_url:
type: string
description: URL to the HLS manifest file
analyze_segments:
type: boolean
default: false
segment_limit:
type: integer
description: Limit number of segments to analyze
default: 10
required:
- manifest_url
QualityComparisonRequest:
type: object
properties:
reference_file:
type: string
description: Path to reference video file
distorted_file:
type: string
description: Path to distorted video file
metrics:
type: array
items:
type: string
enum: [vmaf, psnr, ssim, ms_ssim]
default: [vmaf, psnr, ssim]
model_path:
type: string
description: Path to VMAF model file
required:
- reference_file
- distorted_file
ReportRequest:
type: object
properties:
analysis_id:
type: string
format:
type: string
enum: [json, pdf, html, csv, xml, excel, markdown, text]
default: json
template:
type: string
description: Report template name
options:
type: object
description: Format-specific options
required:
- analysis_id
ReportResponse:
type: object
properties:
report_id:
type: string
status:
type: string
enum: [pending, processing, completed, failed]
format:
type: string
download_url:
type: string
created_at:
type: string
format: date-time
required:
- report_id
- status
- format
UploadResponse:
type: object
properties:
upload_id:
type: string
key:
type: string
url:
type: string
size:
type: integer
content_type:
type: string
created_at:
type: string
format: date-time
required:
- upload_id
- key
- size
AIQuestionRequest:
type: object
properties:
analysis_id:
type: string
question:
type: string
context:
type: string
description: Additional context for the question
required:
- analysis_id
- question
AIResponse:
type: object
properties:
answer:
type: string
confidence:
type: number
minimum: 0
maximum: 1
sources:
type: array
items:
type: string
timestamp:
type: string
format: date-time
required:
- answer
tags:
- name: System
description: System health and status endpoints
- name: Authentication
description: User authentication and authorization
- name: Analysis
description: Media file analysis and probing
- name: HLS
description: HLS playlist analysis and validation
- name: Quality
description: Video quality analysis and comparison
- name: Reports
description: Analysis report generation
- name: Storage
description: File storage and management
- name: AI
description: AI-powered analysis insights