비디오 업로드 자동화 → 자동 섬네일 → Google 드라이브
중급
이것은Content Creation, Multimodal AI분야의자동화 워크플로우로, 9개의 노드를 포함합니다.주로 If, Webhook, GoogleDrive, ExecuteCommand, ReadBinaryFile 등의 노드를 사용하며. FFmpeg 및 Google Drive를 사용한 비디오 업로드 및 썸네일 생성 자동화
사전 요구사항
- •HTTP Webhook 엔드포인트(n8n이 자동으로 생성)
- •Google Drive API 인증 정보
워크플로우 미리보기
노드 연결 관계를 시각적으로 표시하며, 확대/축소 및 이동을 지원합니다
워크플로우 내보내기
다음 JSON 구성을 복사하여 n8n에 가져오면 이 워크플로우를 사용할 수 있습니다
{
"id": "W69y1dllbQpuNZQ0",
"meta": {
"instanceId": "14e4c77104722ab186539dfea5182e419aecc83d85963fe13f6de862c875ebfa",
"templateCredsSetupCompleted": true
},
"name": "Automate Video Upload → Auto-Thumbnail → Google Drive",
"tags": [],
"nodes": [
{
"id": "0f0dc32f-cadc-4001-9ded-4049186ed556",
"name": "메모",
"type": "n8n-nodes-base.stickyNote",
"position": [
-570,
-180
],
"parameters": {
"width": 1600,
"height": 340,
"content": "## Video Upload → Auto-Thumbnail → Google Drive\n\n### **What it does (high level)**\nAccepts a video via HTTP upload, validates it’s a real video file, extracts a thumbnail at the 5-second mark using FFmpeg (auto-installs if missing), saves the thumbnail to a designated Google Drive folder, and returns a JSON response with the new file’s details."
},
"typeVersion": 1
},
{
"id": "9e6b7fcd-2c7a-4762-8dd7-efa102ad9599",
"name": "메모1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-560,
180
],
"parameters": {
"width": 1580,
"height": 660,
"content": "# **Node Breakdown & Descriptions:**\n\n### \\* The workflow starts with a **Webhook** node named **“Accept Video Upload”**, which activates on an HTTP **POST** to `/mediaUpload`. It expects `multipart/form-data` with the file in the `media` field and defers responding until the last node, so the API reply can include the uploaded thumbnail’s metadata.\n\n### \\* The next node, **IF** named **“Validate Upload is Video”**, checks `{{$binary.media.mimeType}}` contains `video/`. Only true (video) items proceed. If it ever receives a non-video, the false branch can return a **400** (optional improvement).\n\n### \\* The **Write Binary File** node named **“Persist Upload to /tmp”** writes the incoming `media` binary to disk at `/tmp/<originalFilename or input.mp4>`. This produces a stable file path for FFmpeg to read from.\n\n### \\* The **Execute Command** node named **“Extract Thumbnail with FFmpeg (Auto-Install)”** runs FFmpeg to grab a single frame at **5 seconds**:\n\n* If FFmpeg exists in the environment, it uses it.\n* Otherwise it **downloads a static FFmpeg** build into `/tmp/ffmpeg` (no root needed) and uses that.\n* Command outputs `/tmp/thumbnail.jpg` (`-ss 5 -frames:v 1 -q:v 2`).\n\n### \\* The **Read Binary File** node named **“Load Thumbnail from Disk”** reads `/tmp/thumbnail.jpg` back into the item’s binary data, preparing it for upload (thumbnail is now available as the node’s binary output).\n\n### \\* The **Google Drive** node named **“Upload Thumbnail to Drive”** uploads the thumbnail image to your target folder (folder ID you configured). The file name is derived from the original video name with a `-thumb.jpg` suffix. On success, it returns Drive metadata such as `id` and `name`.\n\n### \\* Finally, the **Respond to Webhook** node named **“Return API Response”** sends a JSON response to the caller indicating success, including the Drive `thumbnailFileId` and `thumbnailName`, so the client can reference or share the thumbnail immediately."
},
"typeVersion": 1
},
{
"id": "eb68ca4d-93d6-4535-a009-be7a129e18f3",
"name": "Accept Video Upload (Webhook 트리거)",
"type": "n8n-nodes-base.webhook",
"position": [
-480,
0
],
"webhookId": "53a1804d-fde6-4e38-abd4-f22f5cf2e4b2",
"parameters": {
"path": "mediaUpload",
"options": {},
"httpMethod": "POST",
"responseData": "allEntries",
"responseMode": "lastNode"
},
"typeVersion": 1
},
{
"id": "22cf7a78-1f4b-4dac-83b6-718476d74c11",
"name": "Validate Upload is Video (조건 분기)",
"type": "n8n-nodes-base.if",
"position": [
-260,
0
],
"parameters": {
"options": {},
"conditions": {
"string": [
{
"value1": "={{$binary.file.mimeType}}",
"value2": "video/",
"operation": "contains"
}
],
"boolean": []
}
},
"typeVersion": 2
},
{
"id": "9bc950c0-4ffd-4c86-9345-7aa2bb682625",
"name": "Persist Upload to /tmp (바이너리 파일 쓰기)",
"type": "n8n-nodes-base.writeBinaryFile",
"position": [
-40,
0
],
"parameters": {
"options": {},
"fileName": "={{$('Accept Video Upload (Webhook)').item.binary.media.fileName ? \"/tmp/\" + $('Accept Video Upload (Webhook)').item.binary.media.fileName : \"/tmp/input.mp4\"}}",
"dataPropertyName": "media"
},
"typeVersion": 1
},
{
"id": "b8ecc2ac-ddca-42cb-a735-ec3e79e02f1c",
"name": "Extract Thumbnail with FFmpeg (Auto-Install) (명령 실행)",
"type": "n8n-nodes-base.executeCommand",
"position": [
180,
0
],
"parameters": {
"command": "=set -e\n\nVIDEO=\"{{ $('Persist Upload to /tmp (Write Binary File)').item.json.fileName }}\"\nOUT=\"/tmp/{{ $('Accept Video Upload (Webhook)').item.binary.media.fileName }}_thumbnail.jpg\"\n\n# 1) locate ffmpeg\nif command -v ffmpeg >/dev/null 2>&1; then\n FFMPEG_BIN=\"$(command -v ffmpeg)\"\nelif [ -x /tmp/ffmpeg/ffmpeg ]; then\n FFMPEG_BIN=\"/tmp/ffmpeg/ffmpeg\"\nelse\n # 2) fetch a static ffmpeg (no root). Works on most Linux hosts/containers.\n ARCH=\"$(uname -m)\"\n case \"$ARCH\" in\n x86_64|amd64) URL=\"https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz\" ;;\n aarch64|arm64) URL=\"https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-arm64-static.tar.xz\" ;;\n armv7l|armhf) URL=\"https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-armhf-static.tar.xz\" ;;\n i686|i386) URL=\"https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-i686-static.tar.xz\" ;;\n *) echo \"Unsupported CPU arch: $ARCH\" >&2; exit 1 ;;\n esac\n\n mkdir -p /tmp/ffmpeg && cd /tmp/ffmpeg\n\n # downloader: prefer curl, else wget\n if command -v curl >/dev/null 2>&1; then\n curl -fsSL \"$URL\" -o ffmpeg.tar.xz\n elif command -v wget >/dev/null 2>&1; then\n wget -qO ffmpeg.tar.xz \"$URL\"\n else\n echo \"Need curl or wget to fetch ffmpeg\" >&2\n exit 1\n fi\n\n # extract (xz support required by most tars on Linux)\n tar -xJf ffmpeg.tar.xz --strip-components=1\n chmod +x ./ffmpeg ./ffprobe\n FFMPEG_BIN=\"/tmp/ffmpeg/ffmpeg\"\nfi\n\n# 3) do the work\n\"$FFMPEG_BIN\" -y -ss 5 -i \"$VIDEO\" -frames:v 1 -q:v 2 \"$OUT\"\n",
"executeOnce": false
},
"typeVersion": 1
},
{
"id": "736a61c2-bfeb-4821-8ca2-a0e54ddfb04d",
"name": "Load Thumbnail from Disk (바이너리 파일 읽기)",
"type": "n8n-nodes-base.readBinaryFile",
"position": [
400,
0
],
"parameters": {
"filePath": "=/tmp/{{ $('Persist Upload to /tmp (Write Binary File)').item.binary.media.fileName }}_thumbnail.jpg"
},
"typeVersion": 1
},
{
"id": "8b2760d0-22f8-4291-9663-71f01e3c397b",
"name": "Upload Thumbnail to Drive (Google 드라이브)",
"type": "n8n-nodes-base.googleDrive",
"position": [
620,
0
],
"parameters": {
"driveId": {
"__rl": true,
"mode": "list",
"value": "My Drive"
},
"options": {},
"folderId": {
"__rl": true,
"mode": "list",
"value": "1AXMk_yyq3sD_Oc9f5eRLuqtJevbX-d1i",
"cachedResultUrl": "",
"cachedResultName": "Video_Thumbnail"
}
},
"credentials": {
"googleDriveOAuth2Api": {
"id": "LzEW2SwCQjcSdvdB",
"name": "Google Drive account 6"
}
},
"typeVersion": 3
},
{
"id": "418127d5-2902-472c-b4dc-5f9628c7c6b7",
"name": "Return API Response (Respond to Webhook 트리거)",
"type": "n8n-nodes-base.respondToWebhook",
"position": [
840,
0
],
"parameters": {
"options": {
"responseCode": 200
},
"respondWith": "json",
"responseBody": "={\n \"ok\": true,\n \"fileName\": \"{{ $json.name || $json.originalFilename }}\",\n \"type\": \"{{ $json.mimeType || $json.fullFileExtension || $json.fileExtension }}\",\n \"sizeBytes\": \"{{ $json.size }}\",\n \"sizeHuman\": \"={{ (Number($json.size) >= 1048576 ? (Number($json.size)/1048576).toFixed(2) + ' MB' : (Number($json.size)/1024).toFixed(2) + ' KB') }}\",\n \"url\": \"={{ $json.webViewLink || ('https://drive.google.com/file/d/' + $json.id + '/view') }}\",\n \"downloadUrl\": \"={{ $json.webContentLink || ('https://drive.google.com/uc?id=' + $json.id + '&export=download') }}\",\n \"createdTime\": \"{{ $json.createdTime }}\",\n \"modifiedTime\": \"{{ $json.modifiedTime }}\",\n \"image\": {\n \"width\": \"{{ $json.imageMediaMetadata && $json.imageMediaMetadata.width }}\",\n \"height\": \"{{ $json.imageMediaMetadata && $json.imageMediaMetadata.height }}\",\n \"rotation\": \"{{ $json.imageMediaMetadata && $json.imageMediaMetadata.rotation }}\"\n },\n \"owner\": \"{{ $json.owners && $json.owners[0] && $json.owners[0].displayName }}\"\n}"
},
"typeVersion": 1
}
],
"active": false,
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"versionId": "8797b44a-f6aa-4043-9997-84a2147ae0aa",
"connections": {
"Accept Video Upload (Webhook)": {
"main": [
[
{
"node": "Validate Upload is Video (IF)",
"type": "main",
"index": 0
}
]
]
},
"Validate Upload is Video (IF)": {
"main": [
[
{
"node": "Persist Upload to /tmp (Write Binary File)",
"type": "main",
"index": 0
}
]
]
},
"Upload Thumbnail to Drive (Google Drive)": {
"main": [
[
{
"node": "Return API Response (Respond to Webhook)",
"type": "main",
"index": 0
}
]
]
},
"Persist Upload to /tmp (Write Binary File)": {
"main": [
[
{
"node": "Extract Thumbnail with FFmpeg (Auto-Install) (Execute Command)",
"type": "main",
"index": 0
}
]
]
},
"Load Thumbnail from Disk (Read Binary File)": {
"main": [
[
{
"node": "Upload Thumbnail to Drive (Google Drive)",
"type": "main",
"index": 0
}
]
]
},
"Extract Thumbnail with FFmpeg (Auto-Install) (Execute Command)": {
"main": [
[
{
"node": "Load Thumbnail from Disk (Read Binary File)",
"type": "main",
"index": 0
}
]
]
}
}
}자주 묻는 질문
이 워크플로우를 어떻게 사용하나요?
위의 JSON 구성 코드를 복사하여 n8n 인스턴스에서 새 워크플로우를 생성하고 "JSON에서 가져오기"를 선택한 후, 구성을 붙여넣고 필요에 따라 인증 설정을 수정하세요.
이 워크플로우는 어떤 시나리오에 적합한가요?
중급 - 콘텐츠 제작, 멀티모달 AI
유료인가요?
이 워크플로우는 완전히 무료이며 직접 가져와 사용할 수 있습니다. 다만, 워크플로우에서 사용하는 타사 서비스(예: OpenAI API)는 사용자 직접 비용을 지불해야 할 수 있습니다.
관련 워크플로우 추천
AI 기반 동영상 제작 및 Instagram, TikTok, YouTube 업로드
클라우드 드라이브 기반 AI 기반 비디오 제작 및 Instagram, TikTok, YouTube 업로드
If
Set
Code
+
If
Set
Code
53 노드DevCode Journey
콘텐츠 제작
청구서 및 영수증 생성기(HTML to PDF)
자동 인voice 생성기 - Shopify에서 PDF로, Google Drive 저장 및 이메일 전송 지원
If
Code
Gmail
+
If
Code
Gmail
19 노드Jitesh Dugar
콘텐츠 제작
비디오에 자막 생성
OpenAI Whisper와 LibreTranslate를 사용하여 비디오 자막을 생성 및 번역
Gmail
Merge
Webhook
+
Gmail
Merge
Webhook
13 노드Paul Abraham
콘텐츠 제작
잠재 고객 자격 평가 및 라우팅 엔진
AI 기반 잠재 고객 자격 평가 및 라우팅: OpenAI, Slack 및 Airtable 활용
If
Set
Slack
+
If
Set
Slack
17 노드Xavier Tai
콘텐츠 제작
회의록 및 액션 아이템 트래커
AI 기반 회의록: GPT-4, 작업 할당 및 다중 채널 배포 활용
If
Set
Code
+
If
Set
Code
38 노드Jitesh Dugar
콘텐츠 제작
코치 온보딩 및 교육 자동화
문자 메시지, Twilio 및 Google 시트를 사용한 30일 코칭 트레이닝 자동화
If
Set
Code
+
If
Set
Code
36 노드Ronnie Craig
콘텐츠 제작
워크플로우 정보
난이도
중급
노드 수9
카테고리2
노드 유형8
저자
WeblineIndia
@weblineindiaA Leading Software Engineering, Consulting & Outsourcing Services Company in USA & India serving Clients Globally since 1999.
외부 링크
n8n.io에서 보기 →
이 워크플로우 공유