คุณสามารถอัปโหลดวิดีโอได้อย่างน่าเชื่อถือมากขึ้นโดยใช้โปรโตคอลการอัปโหลดแบบเริ่มใหม่ได้สำหรับ Google API โปรโตคอลนี้ช่วยให้คุณดำเนินการอัปโหลดต่อได้หลังจากเครือข่ายหยุดชะงักหรือการส่งข้อมูลอื่นๆ ไม่สำเร็จ ซึ่งจะช่วยประหยัดเวลาและแบนด์วิดท์ในกรณีที่เครือข่ายไม่ทำงาน
การใช้การอัปโหลดที่อัปโหลดต่อได้จะมีประโยชน์อย่างยิ่งในกรณีต่อไปนี้
- คุณกำลังโอนไฟล์ขนาดใหญ่
- มีแนวโน้มที่เครือข่ายจะหยุดชะงักสูง
- การอัปโหลดมาจากอุปกรณ์ที่มีแบนด์วิดท์ต่ำหรือการเชื่อมต่ออินเทอร์เน็ตที่ไม่เสถียร เช่น อุปกรณ์เคลื่อนที่
คู่มือนี้จะอธิบายลำดับคำขอ HTTP ที่แอปพลิเคชันส่งเพื่ออัปโหลดวิดีโอโดยใช้กระบวนการอัปโหลดที่กลับมาดำเนินการต่อได้ คู่มือนี้มีไว้สำหรับนักพัฒนาซอฟต์แวร์ที่ใช้ไลบรารีของไคลเอ็นต์ Google API ไม่ได้เป็นหลัก ซึ่งบางไลบรารีรองรับการอัปโหลดแบบเริ่มใหม่ได้ คู่มือ YouTube Data API - การอัปโหลดวิดีโออธิบายวิธีใช้ไลบรารีของไคลเอ็นต์ Google API สำหรับ Python เพื่ออัปโหลดวิดีโอโดยใช้กระบวนการอัปโหลดที่กลับมาดำเนินการต่อได้
หมายเหตุ: คุณยังดูชุดคําขอสําหรับการอัปโหลดที่กลับมาดําเนินการต่อได้ หรือการดำเนินการอื่นๆ ของ API โดยใช้ไลบรารีไคลเอ็นต์ Google API รายการใดรายการหนึ่งซึ่งเปิดใช้การบันทึก HTTPS เช่น หากต้องการเปิดใช้การติดตาม HTTP สําหรับ Python ให้ใช้ไลบรารี httplib2
ดังนี้
httplib2.debuglevel = 4
ขั้นตอนที่ 1 - เริ่มเซสชันที่กลับมาทำงานต่อได้
หากต้องการเริ่มการอัปโหลดวิดีโอแบบกลับมาดำเนินการต่อได้ ให้ส่งคำขอ POST ไปยัง URL ต่อไปนี้ ใน URL ให้ตั้งค่าพารามิเตอร์ part
เป็นค่าที่เหมาะสมกับคําขอ โปรดทราบว่าค่าพารามิเตอร์จะระบุส่วนที่มีพร็อพเพอร์ตี้ที่คุณกําลังตั้งค่า และระบุส่วนที่คุณต้องการให้คำตอบของ API รวมไว้ด้วย ค่าพารามิเตอร์ใน URL คำขอต้องเข้ารหัส URL
https://www.googleapis.com/upload/youtube/v3/videos?uploadType=resumable&part=PARTS
ตั้งค่าเนื้อหาของคําขอเป็นทรัพยากร video
และตั้งค่าส่วนหัวคำขอ HTTP ต่อไปนี้ด้วย
Authorization
– โทเค็นการให้สิทธิ์สําหรับคําขอContent-Length
– จํานวนไบต์ที่ระบุในส่วนเนื้อหาของคําขอ โปรดทราบว่าคุณไม่จำเป็นต้องระบุส่วนหัวนี้หากใช้การเข้ารหัสการโอนแบบแบ่งกลุ่มContent-Type
– ตั้งค่าเป็นapplication/json; charset=UTF-8
X-Upload-Content-Length
– จํานวนไบต์ที่จะอัปโหลดในคําขอต่อๆ ไป ตั้งค่านี้เป็นขนาดของไฟล์ที่คุณอัปโหลดx-upload-content-type
– ประเภท MIME ของไฟล์ที่คุณอัปโหลด คุณสามารถอัปโหลดไฟล์ที่มีประเภท MIME ของวิดีโอ (video/*
) หรือประเภท MIME ของapplication/octet-stream
ก็ได้
ตัวอย่างต่อไปนี้แสดงวิธีเริ่มเซสชันที่กลับมาดำเนินการต่อได้สำหรับการอัปโหลดวิดีโอ คำขอจะตั้งค่า (และดึงข้อมูล) พร็อพเพอร์ตี้ในส่วน snippet
และ status
ของทรัพยากร video
และจะดึงข้อมูลพร็อพเพอร์ตี้ในส่วน contentdetails
ของทรัพยากรด้วย
post /upload/youtube/v3/videos?uploadType=resumable&part=parts http/1.1 host: www.googleapis.com authorization: bearer auth_token content-length: content_length content-type: application/json; charset=utf-8 x-upload-content-length: x_upload_content_length X-Upload-Content-Type: X_UPLOAD_CONTENT_TYPE video resource
ตัวอย่างต่อไปนี้แสดงคําขอ POST ที่มีการป้อนค่าเหล่านี้ทั้งหมดยกเว้นโทเค็นการตรวจสอบสิทธิ์ ค่า categoryId
ในตัวอย่างสอดคล้องกับหมวดหมู่วิดีโอ คุณดึงข้อมูลรายการหมวดหมู่ที่รองรับได้โดยใช้เมธอด videoCategories.list
ของ API
POST /upload/youtube/v3/videos?uploadType=resumable&part=snippet,status,contentDetails HTTP/1.1 Host: www.googleapis.com Authorization: Bearer AUTH_TOKEN Content-Length: 278 Content-Type: application/json; charset=UTF-8 X-Upload-Content-Length: 3000000 X-Upload-Content-Type: video/* { "snippet": { "title": "My video title", "description": "This is a description of my video", "tags": ["cool", "video", "more keywords"], "categoryId": 22 }, "status": { "privacyStatus": "public", "embeddable": True, "license": "youtube" } }
ขั้นตอนที่ 2 - บันทึก URI ของเซสชันที่กลับมาทำงานต่อได้
หากคำขอสำเร็จ เซิร์ฟเวอร์ API จะตอบกลับด้วยรหัสสถานะ HTTP 200
(OK
) และการตอบกลับจะมีส่วนหัว HTTP Location
ที่ระบุ URI สำหรับเซสชันที่กลับมาทำงานต่อได้ นี่คือ URI ที่คุณจะใช้อัปโหลดไฟล์วิดีโอ
ตัวอย่างด้านล่างแสดงการตอบกลับ API ตัวอย่างสําหรับคําขอในขั้นตอนที่ 1
HTTP/1.1 200 OK Location: https://www.googleapis.com/upload/youtube/v3/videos?uploadType=resumable&upload_id=xa298sd_f&part=snippet,status,contentDetails Content-Length: 0
ขั้นตอนที่ 3 - อัปโหลดไฟล์วิดีโอ
หลังจากดึง URI ของเซสชันจากการตอบกลับของ API แล้ว คุณจะต้องอัปโหลดเนื้อหาไฟล์วิดีโอจริงไปยังตำแหน่งนั้น เนื้อความของคำขอคือเนื้อหาไฟล์ไบนารีของวิดีโอที่คุณอัปโหลด ตัวอย่างด้านล่างแสดงรูปแบบของคําขอ
PUT UPLOAD_URL HTTP/1.1 Authorization: Bearer AUTH_TOKEN Content-Length: CONTENT_LENGTH Content-Type: CONTENT_TYPE BINARY_FILE_DATA
คําขอจะตั้งค่าส่วนหัวคําขอ HTTP ต่อไปนี้
Authorization
– โทเค็นการให้สิทธิ์สําหรับคําขอContent-Length
– ขนาดของไฟล์ที่คุณอัปโหลด ค่านี้ควรเหมือนกับค่าของส่วนหัวคำขอ HTTPX-Upload-Content-Length
ในขั้นตอนที่ 1Content-Type
– ประเภท MIME ของไฟล์ที่คุณอัปโหลด ค่านี้ควรเหมือนกับค่าของส่วนหัวคำขอ HTTPX-Upload-Content-Type
ในขั้นตอนที่ 1
ขั้นตอนที่ 4 - ดำเนินการอัปโหลดให้เสร็จสิ้น
คำขอของคุณจะทำให้เกิดสถานการณ์อย่างใดอย่างหนึ่งต่อไปนี้
-
การอัปโหลดสำเร็จแล้ว
เซิร์ฟเวอร์ API จะตอบกลับด้วยรหัสการตอบกลับ HTTP
201
(Created
) เนื้อความของคำตอบคือทรัพยากรvideo
ที่คุณสร้างขึ้น -
การอัปโหลดไม่สำเร็จ แต่สามารถอัปโหลดต่อได้
คุณควรอัปโหลดต่อได้ในกรณีใดกรณีหนึ่งต่อไปนี้
-
คำขอของคุณถูกขัดจังหวะเนื่องจากการเชื่อมต่อระหว่างแอปพลิเคชันกับเซิร์ฟเวอร์ API ขาดหายไป ในกรณีนี้ คุณจะไม่ได้รับคำตอบจาก API
-
การตอบกลับของ API จะระบุ
5xx
รหัสการตอบกลับต่อไปนี้ โค้ดของคุณควรใช้กลยุทธ์ Exponential Backoff เมื่ออัปโหลดต่อหลังจากได้รับโค้ดตอบกลับเหล่านี้500
-Internal Server Error
502
-Bad Gateway
503
-Service Unavailable
504
-Gateway Timeout
หากต้องการอัปโหลดต่อ ให้ทำตามวิธีการตรวจสอบสถานะการอัปโหลดและอัปโหลดต่อด้านล่าง โปรดทราบว่า URI ของเซสชันที่กลับมาดำเนินการต่อได้แต่ละรายการมีอายุการใช้งานที่จำกัดและจะหมดอายุในที่สุด ด้วยเหตุนี้ เราจึงขอแนะนำให้เริ่มการอัปโหลดแบบกลับมาดำเนินการต่อได้ทันทีที่คุณได้รับ URI ของเซสชัน และกลับมาดำเนินการอัปโหลดที่หยุดชะงักต่อได้ไม่นานหลังจากที่เกิดปัญหา
-
-
การอัปโหลดไม่สำเร็จอย่างถาวร
สำหรับการอัปโหลดที่ไม่สำเร็จ การตอบกลับจะมีการตอบกลับข้อผิดพลาดที่ช่วยอธิบายสาเหตุของการไม่สำเร็จ สำหรับการอัปโหลดที่ไม่สำเร็จอย่างถาวร การตอบกลับของ API จะมีโค้ดตอบกลับ
4xx
หรือโค้ดตอบกลับ5xx
ที่ไม่ใช่โค้ดที่ระบุไว้ข้างต้นหากคุณส่งคำขอที่มี URI ของเซสชันที่หมดอายุแล้ว เซิร์ฟเวอร์จะแสดงผลโค้ดการตอบกลับ HTTP
404
(Not Found
) ในกรณีนี้ คุณจะต้องเริ่มการอัปโหลดแบบเริ่มใหม่ได้ใหม่ รับ URI ของเซสชันใหม่ และเริ่มการอัปโหลดตั้งแต่ต้นโดยใช้ URI ใหม่
ขั้นตอนที่ 4.1: ตรวจสอบสถานะการอัปโหลด
หากต้องการตรวจสอบสถานะของการอัปโหลดที่หยุดชะงักชั่วคราวและกลับมาดำเนินการต่อได้ ให้ส่งคำขอ PUT ที่ว่างเปล่าไปยัง URL การอัปโหลดที่คุณดึงข้อมูลในขั้นตอนที่ 2 และใช้ในขั้นตอนที่ 3 ในคำขอ ให้ตั้งค่าส่วนหัว Content-Range
เป็น bytes */CONTENT_LENGTH
โดยที่ CONTENT_LENGTH คือขนาดของไฟล์ที่คุณอัปโหลด
PUT UPLOAD_URL HTTP/1.1 Authorization: Bearer AUTH_TOKEN Content-Length: 0 Content-Range: bytes */CONTENT_LENGTH
ขั้นตอนที่ 4.2: ประมวลผลการตอบกลับของ API
หากการอัปโหลดเสร็จสมบูรณ์แล้ว ไม่ว่าจะสำเร็จหรือไม่ก็ตาม API จะแสดงผลลัพธ์เดียวกันกับที่ส่งเมื่อการอัปโหลดเสร็จสมบูรณ์ในตอนแรก
อย่างไรก็ตาม หากการอัปโหลดถูกขัดจังหวะหรือยังอยู่ระหว่างดำเนินการ การตอบกลับของ API จะมีโค้ดการตอบกลับ HTTP 308
(Resume Incomplete
) ส่วนในคำตอบ ส่วนหัว Range
จะระบุจำนวนไบต์ของไฟล์ที่อัปโหลดสำเร็จแล้ว
- ระบบจะจัดทําดัชนีค่าส่วนหัวจาก
0
ดังนั้น ค่าส่วนหัว0-999999
บ่งบอกว่ามีการอัปโหลดไบต์1,000,000
แรกของไฟล์แล้ว - หากยังไม่ได้อัปโหลดข้อมูลใดๆ การตอบกลับของ API จะไม่มีส่วนหัว
Range
ตัวอย่างการตอบกลับด้านล่างแสดงรูปแบบของการตอบกลับ API สําหรับการอัปโหลดที่กลับมาดำเนินการต่อได้
308 Resume Incomplete Content-Length: 0 Range: bytes=0-999999
หากคำตอบของ API ยังมีส่วนหัว Retry-After
ด้วย ให้ใช้ค่าของส่วนหัวนั้นเพื่อกำหนดเวลาที่จะพยายามอัปโหลดต่อ
ขั้นตอนที่ 4.3: อัปโหลดต่อ
หากต้องการอัปโหลดต่อ ให้ส่งคำขอ PUT
อีกครั้งไปยัง URL การอัปโหลดที่บันทึกไว้ในขั้นตอนที่ 2 ตั้งค่าเนื้อหาคำขอเป็นโค้ดไบนารีสำหรับส่วนของไฟล์วิดีโอที่ยังไม่ได้อัปโหลด
PUT UPLOAD_URL HTTP/1.1 Authorization: Bearer AUTH_TOKEN Content-Length: REMAINING_CONTENT_LENGTH Content-Range: bytes FIRST_BYTE-LAST_BYTE/TOTAL_CONTENT_LENGTH PARTIAL_BINARY_FILE_DATA
คุณต้องตั้งค่าส่วนหัวคำขอ HTTP ต่อไปนี้
-
Authorization
– โทเค็นการให้สิทธิ์สําหรับคําขอ -
Content-Length
– ขนาดของเนื้อหาที่ยังไม่ได้อัปโหลดเป็นไบต์ หากคุณอัปโหลดไฟล์ที่เหลืออยู่ คุณสามารถคํานวณค่านี้ได้โดยลบค่าFIRST_BYTE
ออกจากค่าTOTAL_CONTENT_LENGTH
ระบบจะใช้ทั้ง 2 ค่าในส่วนหัวContent-Range
-
Content-Range
– ส่วนของไฟล์ที่คุณอัปโหลด ค่าส่วนหัวประกอบด้วย 3 ค่า ดังนี้-
FIRST_BYTE
– ดัชนีตัวเลขฐาน 0 ของจำนวนไบต์ที่คุณอัปโหลดต่อ ค่านี้จะสูงกว่าตัวเลขที่ 2 ในส่วนหัวRange
ที่ดึงข้อมูลในขั้นตอนก่อนหน้า 1 หน่วย ในตัวอย่างก่อนหน้านี้ ค่าส่วนหัวRange
คือ0-999999
ดังนั้นไบต์แรกในการอัปโหลดที่กลับมาดำเนินการต่อในภายหลังจะเป็น1000000
-
LAST_BYTE
– ดัชนีตัวเลขฐาน 0 ของไบต์สุดท้ายของไฟล์ไบนารีที่คุณอัปโหลด โดยปกติแล้วจะเป็นไบต์สุดท้ายในไฟล์ ตัวอย่างเช่น หากขนาดไฟล์คือ3000000
ไบต์ ไบต์สุดท้ายในไฟล์จะเป็นหมายเลข2999999
-
TOTAL_CONTENT_LENGTH
– ขนาดไฟล์วิดีโอทั้งหมดในหน่วยไบต์ ค่านี้เหมือนกับส่วนหัวContent-Length
ที่ระบุไว้ในคำขออัปโหลดต้นฉบับ
หมายเหตุ: คุณไม่สามารถอัปโหลดบล็อกของไฟล์ไบนารีที่ไม่ต่อเนื่อง หากคุณพยายามอัปโหลดบล็อกที่ไม่ต่อเนื่อง ระบบจะไม่อัปโหลดเนื้อหาไบนารีที่เหลือ
ด้วยเหตุนี้ ไบต์แรกที่อัปโหลดในการอัปโหลดที่กลับมาดำเนินการต่อต้องเป็นแบ็กต่อจากไบต์สุดท้ายที่อัปโหลดไปยัง YouTube สำเร็จแล้ว (ดูการพูดคุยเรื่องส่วนหัวRange
ในขั้นตอนที่ 4.2
ดังนั้น หากไบต์สุดท้ายในส่วนหัวRange
คือ999999
ไบต์แรกในคำขออัปโหลดต่อต้องเป็นไบต์ 1000000 (ทั้ง 2 ตัวเลขใช้ดัชนีฐาน 0) หากคุณพยายามอัปโหลดต่อจากไบต์ 999999 หรือต่ำกว่า (ไบต์ที่ทับซ้อนกัน) หรือไบต์ 1000001 ขึ้นไป (การข้ามไบต์) ระบบจะไม่อัปโหลดเนื้อหาไบนารีใดๆ -
อัปโหลดไฟล์เป็นกลุ่ม
แอปพลิเคชันสามารถแบ่งไฟล์ออกเป็นหลายส่วนและส่งชุดคำขอเพื่ออัปโหลดแต่ละส่วนตามลำดับแทนที่จะพยายามอัปโหลดทั้งไฟล์และอัปโหลดต่อในกรณีที่เครือข่ายขัดข้อง แทบไม่จําเป็นต้องใช้แนวทางนี้และเราไม่แนะนําให้ใช้ เนื่องจากต้องใช้คําขอเพิ่มเติมซึ่งส่งผลต่อประสิทธิภาพ อย่างไรก็ตาม ตัวเลือกนี้อาจมีประโยชน์หากคุณพยายามแสดงตัวบ่งชี้ความคืบหน้าในเครือข่ายที่ไม่เสถียรมาก
วิธีการอัปโหลดไฟล์เป็นกลุ่มแทบจะเหมือนกับกระบวนการ 4 ขั้นตอนที่อธิบายไว้ก่อนหน้านี้ในคู่มือนี้ อย่างไรก็ตาม คำขอเริ่มอัปโหลดไฟล์ (ขั้นตอนที่ 3 ด้านบน) และคำขออัปโหลดต่อ (ขั้นตอนที่ 4.3 ด้านบน) ต่างกำหนดค่าส่วนหัว Content-Length
และ Content-Range
แตกต่างกันเมื่อมีการอัปโหลดไฟล์เป็นกลุ่ม
-
ค่าส่วนหัว
Content-Length
จะระบุขนาดของกลุ่มที่คำขอส่ง โปรดทราบข้อจำกัดต่อไปนี้เกี่ยวกับขนาดของข้อมูล-
ขนาดของข้อมูลต้องเป็นจํานวนเต็มคูณด้วย 256 KB (ข้อจำกัดนี้ไม่มีผลกับกลุ่มสุดท้ายเนื่องจากขนาดของไฟล์ทั้งหมดอาจไม่ใช่จำนวนที่คูณด้วย 256 KB) โปรดทราบว่ากลุ่มที่ใหญ่กว่านั้นมีประสิทธิภาพมากกว่า
-
ขนาดของข้อมูลแต่ละกลุ่มต้องเหมือนกันสำหรับคำขอแต่ละรายการในลำดับการอัปโหลด ยกเว้นคำขอสุดท้ายที่จะระบุขนาดของกลุ่มสุดท้าย
-
-
ส่วนหัว
Content-Range
จะระบุจำนวนไบต์ในไฟล์ที่คำขออัปโหลด วิธีการตั้งค่าส่วนหัวContent-Range
ในขั้นตอนที่ 4.3 จะมีผลเมื่อตั้งค่านี้ตัวอย่างเช่น ค่า
bytes 0-524287/2000000
แสดงว่าคําขอส่งไบต์ 524,288 ไบต์แรก (256 x 2048) ในไฟล์ 2,000,000 ไบต์
ตัวอย่างด้านล่างแสดงรูปแบบของคําขอแรกในชุดคําขอที่จะอัปโหลดไฟล์ขนาด 2,000,000 ไบต์เป็นกลุ่มๆ
PUT UPLOAD_URL HTTP/1.1 Authorization: Bearer AUTH_TOKEN Content-Length: 524888 Content-Type: video/* Content-Range: bytes 0-524287/2000000 {bytes 0-524287}
หากคำขออื่นที่ไม่ใช่คำขอสุดท้ายสำเร็จ เซิร์ฟเวอร์ API จะตอบกลับด้วย 308
(Resume Incomplete
) รูปแบบการตอบกลับจะเหมือนกับที่อธิบายไว้ในขั้นตอนที่ 4.2: ประมวลผลการตอบกลับของ API ด้านบน
ใช้ค่าบนสุดที่แสดงในส่วนหัว Range
ของคำตอบ API เพื่อกำหนดจุดเริ่มต้นของกลุ่มถัดไป ส่งคําขอ PUT
ต่อไปตามที่อธิบายไว้ในขั้นตอนที่ 4.3: อัปโหลดต่อ เพื่ออัปโหลดกลุ่มไฟล์ต่อๆ ไปจนกว่าระบบจะอัปโหลดไฟล์ทั้งไฟล์
เมื่ออัปโหลดไฟล์ทั้งไฟล์แล้ว เซิร์ฟเวอร์จะตอบกลับด้วย201
โค้ดการตอบกลับ HTTP (Created
) และแสดงผลส่วนที่ขอของทรัพยากรวิดีโอที่สร้างขึ้นใหม่
หากคำขอถูกขัดจังหวะหรือแอปพลิเคชันได้รับรหัสคำตอบ 5xx
ให้ทำตามขั้นตอนที่อธิบายไว้ในขั้นตอนที่ 4 เพื่ออัปโหลดให้เสร็จสมบูรณ์ อย่างไรก็ตาม แทนที่จะพยายามอัปโหลดไฟล์ที่เหลือ ให้อัปโหลดข้อมูลส่วนต่างๆ ต่อจากจุดที่คุณกลับมาอัปโหลดต่อ อย่าลืมตรวจสอบสถานะการอัปโหลดเพื่อดูว่าควรอัปโหลดไฟล์ต่อจากจุดใด อย่าคิดว่าเซิร์ฟเวอร์ได้รับไบต์ทั้งหมด (หรือไม่มีเลย) ที่ส่งในคำขอก่อนหน้า
หมายเหตุ: คุณยังขอสถานะของการอัปโหลดที่ใช้งานอยู่ระหว่างข้อมูลส่วนที่อัปโหลดแล้วได้ด้วย (การอัปโหลดไม่จำเป็นต้องถูกขัดจังหวะก่อนที่คุณจะสามารถเรียกดูสถานะได้)