Anda dapat mengupload video dengan lebih andal menggunakan protokol upload yang dapat dilanjutkan untuk Google API. Protokol ini memungkinkan Anda melanjutkan operasi upload setelah gangguan jaringan atau kegagalan transmisi lainnya, menghemat waktu dan bandwidth jika terjadi kegagalan jaringan.
Menggunakan upload yang dapat dilanjutkan sangat berguna dalam salah satu kasus berikut:
- Anda mentransfer file berukuran besar.
- Kemungkinan gangguan jaringan tinggi.
- Upload berasal dari perangkat dengan koneksi bandwidth rendah atau tidak stabil, seperti perangkat seluler.
Panduan ini menjelaskan urutan permintaan HTTP yang dibuat aplikasi untuk mengupload video menggunakan proses upload yang dapat dilanjutkan. Panduan ini terutama ditujukan bagi developer yang tidak dapat menggunakan library klien Google API, yang beberapa di antaranya memberikan dukungan native untuk upload yang dapat dilanjutkan. Bahkan, panduan YouTube Data API - Mengupload Video menjelaskan cara menggunakan Library Klien Google API untuk Python agar dapat mengupload video menggunakan proses upload yang dapat dilanjutkan.
Catatan: Anda juga dapat melihat serangkaian permintaan yang dibuat untuk upload yang dapat dilanjutkan atau operasi API lainnya menggunakan salah satu library klien Google API dengan logging HTTPS yang diaktifkan. Misalnya, untuk mengaktifkan trace HTTP untuk Python, gunakan library httplib2
:
httplib2.debuglevel = 4
Langkah 1 - Mulai sesi yang dapat dilanjutkan
Untuk memulai upload video yang dapat dilanjutkan, kirim permintaan POST ke URL berikut. Di URL, tetapkan nilai parameter part
ke nilai yang sesuai untuk permintaan Anda. Ingat bahwa nilai parameter mengidentifikasi bagian yang berisi properti yang Anda tetapkan, dan juga mengidentifikasi bagian yang Anda inginkan untuk disertakan oleh respons API. Nilai parameter di URL permintaan harus berenkode URL.
https://www.googleapis.com/upload/youtube/v3/videos?uploadType=resumable&part=PARTS
Tetapkan isi permintaan ke resource video
. Tetapkan juga header permintaan HTTP berikut:
Authorization
– Token otorisasi untuk permintaan.Content-Length
– Jumlah byte yang diberikan dalam isi permintaan. Perhatikan bahwa Anda tidak perlu memberikan header ini jika Anda menggunakan potongan encoding transfer.Content-Type
– Tetapkan nilai keapplication/json; charset=UTF-8
.X-Upload-Content-Length
– Jumlah byte yang akan diupload dalam permintaan berikutnya. Tetapkan nilai ini ke ukuran file yang Anda upload.x-upload-content-type
– jenis MIME dari file yang Anda upload. Anda dapat mengupload file dengan jenis MIME video apa pun (video/*
) atau jenis MIMEapplication/octet-stream
.
contoh berikut menunjukkan cara memulai sesi yang dapat dilanjutkan untuk mengupload video. permintaan menetapkan (dan akan mengambil) properti di bagian video
resource snippet
dan status
, dan juga akan mengambil properti di bagian contentdetails
resource.
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
Contoh berikut menunjukkan permintaan POST yang semua nilainya diisi dengan pengecualian token autentikasi. Nilai categoryId
dalam contoh sesuai dengan kategori video. Daftar kategori yang didukung dapat diambil menggunakan metode 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" } }
Langkah 2 - Simpan URI sesi yang dapat dilanjutkan
Jika permintaan Anda berhasil, server API akan merespons dengan kode status HTTP 200
(OK
), dan responsnya akan menyertakan header HTTP Location
yang menentukan URI untuk sesi yang dapat dilanjutkan. Ini adalah URI yang akan Anda gunakan untuk mengupload file video.
Contoh di bawah menunjukkan contoh respons API terhadap permintaan pada langkah 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
Langkah 3 - Upload file video
Setelah mengekstrak URI sesi dari respons API, Anda harus mengupload konten file video yang sebenarnya ke lokasi tersebut. Isi permintaan adalah konten file biner untuk video yang Anda upload. Contoh di bawah ini menunjukkan format permintaan.
PUT UPLOAD_URL HTTP/1.1 Authorization: Bearer AUTH_TOKEN Content-Length: CONTENT_LENGTH Content-Type: CONTENT_TYPE BINARY_FILE_DATA
Permintaan menetapkan header permintaan HTTP berikut:
Authorization
– Token otorisasi untuk permintaan.Content-Length
– Ukuran file yang akan diupload. Nilai ini harus sama dengan nilai header permintaan HTTPX-Upload-Content-Length
di langkah 1.Content-Type
– Jenis MIME dari file yang akan Anda upload. Nilai ini harus sama dengan nilai header permintaan HTTPX-Upload-Content-Type
di langkah 1.
Langkah 4 - Selesaikan proses upload
Permintaan Anda akan menyebabkan salah satu skenario berikut:
-
Upload Anda berhasil.
Server API merespons dengan kode respons HTTP
201
(Created
). Isi respons adalah resourcevideo
yang Anda buat. -
Upload Anda tidak berhasil, tetapi dapat dilanjutkan.
Anda dapat melanjutkan upload dalam salah satu kasus berikut:
-
Permintaan Anda terganggu karena koneksi antara aplikasi dan server API terputus. Dalam hal ini, Anda tidak akan menerima respons API.
-
Respons API menentukan salah satu kode respons
5xx
berikut. Kode Anda harus menggunakan strategi backoff eksponensial saat melanjutkan upload setelah menerima salah satu kode respons ini.500
–Internal Server Error
502
–Bad Gateway
503
–Service Unavailable
504
–Gateway Timeout
Untuk melanjutkan upload, ikuti petunjuk untuk memeriksa status upload dan melanjutkan upload di bawah. Ingat bahwa setiap URI sesi yang dapat dilanjutkan memiliki masa berlaku yang terbatas dan akan berakhir. Karena alasan ini, sebaiknya mulai upload yang dapat dilanjutkan segera setelah Anda mendapatkan URI sesi dan melanjutkan upload yang terhenti segera setelah terjadi gangguan.
-
-
Upload Anda gagal secara permanen.
Untuk upload yang gagal, respons tersebut berisi respons error yang membantu menjelaskan penyebab kegagalan. Untuk upload yang gagal secara permanen, respons API akan memiliki kode respons
4xx
atau kode respons5xx
selain yang tercantum di atas.Jika Anda mengirim permintaan dengan URI sesi yang sudah tidak berlaku, server akan menampilkan kode respons HTTP
404
(Not Found
). Dalam hal ini, Anda harus memulai upload baru yang dapat dilanjutkan, mendapatkan URI sesi baru, dan memulai upload dari awal menggunakan URI baru.
Langkah 4.1: Periksa status upload
Untuk memeriksa status upload yang dapat dilanjutkan dan terputus, kirim permintaan PUT kosong ke URL upload yang Anda ambil di langkah 2 dan juga gunakan pada langkah 3. Dalam permintaan Anda, setel nilai header Content-Range
ke bytes */CONTENT_LENGTH
, dengan CONTENT_LENGTH adalah ukuran file yang Anda upload.
PUT UPLOAD_URL HTTP/1.1 Authorization: Bearer AUTH_TOKEN Content-Length: 0 Content-Range: bytes */CONTENT_LENGTH
Langkah 4.2: Proses respons API
Jika upload sudah selesai, API akan menampilkan respons yang sama seperti yang dikirimkan saat upload pertama kali selesai atau gagal.
Namun, jika upload terhenti atau masih berlangsung, respons API akan memiliki kode respons 308
(Resume Incomplete
) HTTP. Dalam respons, header Range
menentukan jumlah byte file yang telah berhasil diupload.
- Nilai header diindeks dari
0
. Dengan demikian, nilai header0-999999
menunjukkan bahwa1,000,000
byte pertama dari file tersebut telah diupload. - Jika belum ada yang diupload, respons API tidak akan menyertakan header
Range
.
Contoh respons di bawah ini menunjukkan format respons API untuk upload yang dapat dilanjutkan:
308 Resume Incomplete Content-Length: 0 Range: bytes=0-999999
Jika respons API juga menyertakan header Retry-After
, gunakan nilai header tersebut untuk menentukan kapan harus melanjutkan upload.
Langkah 4.3: Lanjutkan upload
Untuk melanjutkan upload, kirim permintaan PUT
lainnya ke URL upload yang diambil di langkah 2. Tetapkan isi permintaan ke kode biner untuk bagian file video yang belum diupload.
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
Anda perlu menetapkan header permintaan HTTP berikut:
-
Authorization
– Token otorisasi untuk permintaan. -
Content-Length
– Ukuran, dalam byte, dari konten yang belum diupload. Jika Anda mengupload sisa file, Anda dapat menghitung nilai ini dengan mengurangi nilaiFIRST_BYTE
dari nilaiTOTAL_CONTENT_LENGTH
. Kedua nilai tersebut digunakan di headerContent-Range
. -
Content-Range
– Bagian dari file yang Anda upload. Nilai header terdiri dari tiga nilai:-
FIRST_BYTE
– Indeks numerik berbasis 0 dari nomor byte asal Anda melanjutkan upload. Nilai ini satu angka lebih tinggi daripada angka kedua di headerRange
yang diambil pada langkah sebelumnya. Pada contoh sebelumnya, nilai headerRange
adalah0-999999
sehingga byte pertama dalam upload yang dilanjutkan berikutnya adalah1000000
. -
LAST_BYTE
– Indeks numerik berbasis 0 dari byte terakhir file biner yang Anda upload. Biasanya, ini adalah byte terakhir dalam file. Jadi, misalnya, jika ukuran file adalah3000000
byte, byte terakhir dalam file adalah angka2999999
. -
TOTAL_CONTENT_LENGTH
– Ukuran total file video dalam byte. Nilai ini sama dengan headerContent-Length
yang ditentukan dalam permintaan upload asli.
Catatan: Anda tidak dapat mengupload blok file biner yang tidak berkelanjutan. Jika Anda mencoba mengupload blok tanpa jeda, tidak ada konten biner yang tersisa yang akan diupload.
Dengan demikian, byte pertama yang diupload dalam upload yang dilanjutkan harus berupa byte berikutnya setelah byte terakhir yang berhasil diupload ke YouTube. (Lihat diskusi tentang headerRange
pada langkah 4.2.
Jadi, jika byte terakhir di headerRange
adalah999999
, byte pertama dalam permintaan untuk melanjutkan upload harus berupa byte 1000000. (Kedua angka menggunakan indeks berbasis 0.) Jika Anda mencoba untuk melanjutkan upload dari byte 999999 atau yang lebih rendah (overlap byte) atau byte 1000001 atau yang lebih tinggi (melewati byte), tidak ada konten biner yang akan diupload. -
Mengupload potongan file
Daripada mencoba mengupload seluruh file dan melanjutkan upload jika terjadi gangguan jaringan, aplikasi Anda dapat membagi file menjadi potongan-potongan dan mengirim serangkaian permintaan untuk mengupload potongan secara berurutan. Pendekatan ini jarang diperlukan dan sebenarnya tidak disarankan karena memerlukan permintaan tambahan, yang memiliki implikasi performa. Namun, mungkin berguna jika Anda mencoba menampilkan indikator progres pada jaringan yang sangat tidak stabil.
Petunjuk untuk mengupload file dalam bentuk potongan hampir identik dengan proses empat langkah yang dijelaskan sebelumnya dalam panduan ini. Namun, permintaan untuk mulai mengupload file (langkah 3 di atas) dan melanjutkan upload (langkah 4.3 di atas) menetapkan nilai header Content-Length
dan Content-Range
secara berbeda saat file diupload dalam potongan.
-
Nilai header
Content-Length
menentukan ukuran potongan yang dikirim oleh permintaan. Perhatikan batasan berikut pada ukuran potongan:-
Ukuran potongan harus kelipatan 256 KB. (Pembatasan ini tidak berlaku untuk bagian terakhir karena ukuran seluruh file mungkin bukan kelipatan 256 KB.) Perlu diingat bahwa potongan yang lebih besar lebih efisien.
-
Ukuran potongan harus sama untuk setiap permintaan dalam urutan upload dengan pengecualian permintaan terakhir, yang menentukan ukuran potongan akhir.
-
-
Header
Content-Range
menentukan byte dalam file yang diupload oleh permintaan. Petunjuk untuk menetapkan headerContent-Range
pada langkah 4.3 berlaku saat menetapkan nilai ini.Misalnya, nilai
bytes 0-524287/2000000
menunjukkan bahwa permintaan tersebut mengirimkan 524.288 byte pertama (256 x 2048) dalam file 2.000.000 byte.
Contoh di bawah ini menunjukkan format pertama dari serangkaian permintaan yang akan mengupload file 2.000.000 byte dalam bentuk potongan:
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}
Jika permintaan selain permintaan akhir berhasil, server API akan merespons dengan respons 308
(Resume Incomplete
). Format respons akan sama seperti yang dijelaskan dalam Langkah 4.2: Proses respons API di atas.
Gunakan nilai yang lebih besar yang ditampilkan dalam header Range
respons API untuk menentukan tempat memulai potongan berikutnya. Lanjutkan mengirim permintaan PUT
, seperti yang dijelaskan di Langkah 4.3: Lanjutkan upload, untuk mengupload potongan file berikutnya hingga seluruh file selesai diupload.
Setelah seluruh file diupload, server akan merespons dengan kode respons HTTP 201
(Created
) dan menampilkan bagian yang diminta dari resource video yang baru dibuat.
Jika ada permintaan yang terhenti atau aplikasi Anda menerima kode respons 5xx
, ikuti prosedur yang dijelaskan pada langkah 4 untuk menyelesaikan upload. Namun, alih-alih mencoba mengupload sisa file, cukup lanjutkan mengupload potongan dari titik tempat Anda melanjutkan upload. Pastikan untuk menggunakan status upload guna menentukan tempat untuk melanjutkan upload file. Jangan berasumsi bahwa server menerima semua (atau tidak ada) byte yang dikirim dalam permintaan sebelumnya.
Catatan: Anda juga dapat meminta status upload aktif di antara potongan yang diupload. (Upload tidak perlu diganggu sebelum Anda dapat mengambil statusnya.)