{"name":"banan0 FFmpeg + Media API","version":"1.2.0","endpoints":[{"method":"GET","path":"/health","description":"Health check with dependency validation"},{"method":"GET","path":"/metrics","description":"Prometheus metrics endpoint"},{"method":"GET","path":"/screenshot","description":"Capture website screenshot","params":"url, width?, height?, fullPage?, format?, quality?, waitFor?"},{"method":"POST","path":"/screenshot","description":"Capture website screenshot (POST)","body":"url, width?, height?, fullPage?, format?, quality?, waitFor?"},{"method":"POST","path":"/compress","description":"Compress video","params":"quality=low|medium|high|maximum"},{"method":"POST","path":"/convert","description":"Convert format","params":"format=mp4|webm|mov|avi|mkv"},{"method":"POST","path":"/trim","description":"Trim video","params":"start, end|duration"},{"method":"POST","path":"/extract-audio","description":"Extract audio","params":"format=mp3|wav|aac|flac|ogg, bitrate"},{"method":"POST","path":"/extract-frames","description":"Extract frames","params":"fps, timestamp, format=jpg|png"},{"method":"POST","path":"/video-to-gif","description":"Convert to GIF","params":"fps, width, start, duration, quality"},{"method":"POST","path":"/rotate","description":"Rotate video","params":"angle=90|180|270|-90, flip=horizontal|vertical|both"},{"method":"POST","path":"/rotate-image","description":"Rotate image","params":"angle=90|180|270|-90, flip=horizontal|vertical|both"},{"method":"POST","path":"/reverse","description":"Reverse video playback","params":"audio=true|false (reverse audio or mute)"},{"method":"GET","path":"/resize/presets","description":"Get social media presets"},{"method":"POST","path":"/resize","description":"Resize video","params":"preset|width+height, fit=contain|cover|fill"},{"method":"POST","path":"/merge","description":"Merge videos","params":"Multiple file uploads"},{"method":"POST","path":"/remove-watermark","description":"Remove image watermark (ML)","params":"watermark_type=istock|shutterstock|adobe|generic"},{"method":"POST","path":"/remove-video-watermark","description":"Remove video watermark (FFmpeg)","params":"x, y, width, height"},{"method":"GET","path":"/youtube/info","description":"Get video metadata","params":"url"},{"method":"POST","path":"/youtube/download","description":"Download YouTube video","body":"url, quality?, format?, audioOnly?"},{"method":"POST","path":"/youtube/download-to-storage","description":"Download and upload to Supabase Storage","body":"url, quality?, format?, storageBucket, storagePath"},{"method":"POST","path":"/youtube/extract-clip","description":"Download and extract clip","body":"url, startTime, endTime, quality?, aspectRatio?"},{"method":"POST","path":"/video-thumbnail","description":"Extract thumbnail from video URL","body":"videoUrl, timestamp, width?, quality?, storageBucket?, storagePath?"},{"method":"POST","path":"/video-thumbnails-batch","description":"Extract multiple thumbnails","body":"videoUrl, timestamps[], storageBucket, storagePathPrefix"},{"method":"POST","path":"/timeline/export","description":"Stitch timeline with transitions/audio/text and upload to Supabase","body":"sessionId, videoClips[], audioTracks?, textOverlays?, aspectRatio?, resolution?, storageBucket, storagePath"},{"method":"POST","path":"/lufs-meter","description":"Analyze audio loudness (EBU R128)","params":"normalize?, format?"},{"method":"GET","path":"/lufs-meter/presets","description":"Get loudness target presets"},{"method":"POST","path":"/convert-audio","description":"Convert audio between formats","params":"format, bitrate?, sampleRate?, channels?, url?"},{"method":"GET","path":"/convert-audio/formats","description":"Get supported audio formats"},{"method":"POST","path":"/extract-sprite-frames","description":"Extract N frames at even intervals for sprite sheet","body":"{ videoUrl, frameCount, format? }"},{"method":"POST","path":"/assemble-sprite-sheet","description":"Assemble frame images into sprite sheet","body":"{ frames[] (base64), layout?, format?, gridColumns? }"},{"method":"POST","path":"/separate-stems","description":"Start audio stem separation job (vocals, drums, bass, other)","body":"file upload or { url, storageBucket?, storagePathPrefix? }"},{"method":"GET","path":"/separate-stems/:jobId","description":"Poll stem separation job status"},{"method":"GET","path":"/separate-stems/:jobId/download","description":"Download stems zip file (if not uploaded to storage)"},{"method":"POST","path":"/separate-stems/:jobId/cancel","description":"Cancel a queued stem separation job"},{"method":"GET","path":"/separate-stems/stats","description":"Get stem separation queue statistics"}],"limits":{"maxFileSize":"100MB per file","maxFiles":"10 files for merge","rateLimit":"100 requests/hour","youtubeMaxDuration":"10 minutes for clip extraction"}}