Google API'leri için devam ettirilebilir yükleme protokolünü kullanarak videoları daha güvenilir bir şekilde yükleyebilirsiniz. Bu protokol, ağ kesintisinden veya başka bir iletim hatasından sonra yükleme işlemine devam etmenize olanak tanıyarak ağ arızaları durumunda zaman ve bant genişliğinden tasarruf etmenizi sağlar.
Devam ettirilebilir yüklemeleri kullanmak aşağıdaki durumlarda özellikle yararlıdır:
- Büyük dosyaları aktarıyorsunuz.
- Ağ kesintisi yaşanabilir.
- Yüklemelerin bant genişliği düşük veya internet bağlantısı kararlı olmayan bir cihaz (ör. mobil cihaz) varsa.
Bu kılavuzda, bir uygulamanın devam ettirilebilir yükleme işlemi kullanarak video yüklemek için yaptığı HTTP istekleri dizisi açıklanmaktadır. Bu kılavuz, temel olarak Google API istemci kitaplıkları'nı kullanamayan ve bazıları devam ettirilebilir yüklemeler için yerel destek kullanamayan geliştiricilere yöneliktir. Aslında, YouTube Data API - Video Yükleme kılavuzunda, devam ettirilebilir bir yükleme işlemiyle video yüklemek üzere Python için Google API'leri İstemci Kitaplığı'nın nasıl kullanılacağı açıklanmaktadır.
Not: HTTPS günlük kaydı etkin olan Google API istemci kitaplıklarından birini kullanarak devam ettirilebilir yükleme veya başka bir API işlemi için yapılan istek dizisini de görebilirsiniz. Örneğin, Python'da HTTP izlemeyi etkinleştirmek için httplib2
kitaplığını kullanın:
httplib2.debuglevel = 4
1. Adım: Devam ettirilebilir bir oturum başlatın
Devam ettirilebilir bir video yükleme işlemi başlatmak için aşağıdaki URL'ye bir POST isteği gönderin. URL'de, part
parametre değerini isteğiniz için uygun değere ayarlayın. Parametre değerinin, ayarladığınız özellikleri içeren bölümleri ve API yanıtında yer almasını istediğiniz bölümleri tanımladığını unutmayın. İstek URL'sindeki parametre değerleri URL olarak kodlanmış olmalıdır.
https://www.googleapis.com/upload/youtube/v3/videos?uploadType=resumable&part=PARTS
İsteğin gövdesini bir video
kaynağı olarak ayarlayın. Ayrıca, aşağıdaki HTTP istek başlıklarını ayarlayın:
Authorization
– İsteğin yetkilendirme jetonu.Content-Length
– İsteğin gövde bölümünde sağlanan bayt sayısı. Parçalı aktarım kodlamasını kullanıyorsanız bu üstbilgiyi sağlamanız gerekmediğini unutmayın.Content-Type
– Değeriapplication/json; charset=UTF-8
olarak ayarlayın.X-Upload-Content-Length
– Sonraki isteklerde yüklenecek bayt sayısı. Bu değeri, yüklediğiniz dosyanın boyutuna ayarlayın.x-upload-content-type
– Yüklediğiniz dosyanın MIME türü. Herhangi bir video MIME türüne (video/*
) veya MIME türüne sahip dosyalarıapplication/octet-stream
yükleyebilirsiniz.
Aşağıdaki örnekte bir video yüklemenin devam ettirilebilir oturumu nasıl başlatılacağı gösterilmektedir. İstek, video
kaynağının snippet
ve status
bölümlerinde özellikleri ayarlar (ve alır). Ayrıca, kaynağın contentdetails
bölümünde özellikleri alır.
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
Aşağıdaki örnekte, kimlik doğrulama jetonu hariç, bu değerlerin tümünü içeren bir POST isteği gösterilmektedir. Örnekteki categoryId
değeri bir video kategorisine karşılık gelir. Desteklenen kategorilerin listesi, API'nin videoCategories.list
yöntemi kullanılarak alınabilir.
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. Adım - Devam ettirilebilir oturum URI'sini kaydedin
İsteğiniz başarılı olursa API sunucusu 200
(OK
) HTTP durum koduyla yanıt verir ve yanıt, devam ettirilebilir oturumun URI'sını belirten Location
HTTP üst bilgisi içerir. Bu, video dosyanızı yüklemek için kullanacağınız URI'dır.
Aşağıdaki örnekte 1. adımda isteğe yönelik örnek bir API yanıtı gösterilmektedir:
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. Adım - Video dosyasını yükleyin
Oturum URI'sini API yanıtından çıkardıktan sonra, gerçek video dosyası içeriğini bu konuma yüklemeniz gerekir. İsteğin gövdesi, yüklediğiniz videonun ikili dosya içeriğidir. Aşağıdaki örnekte isteğin biçimi gösterilmektedir.
PUT UPLOAD_URL HTTP/1.1 Authorization: Bearer AUTH_TOKEN Content-Length: CONTENT_LENGTH Content-Type: CONTENT_TYPE BINARY_FILE_DATA
İstek, aşağıdaki HTTP istek başlıklarını ayarlar:
Authorization
– İsteğin yetkilendirme jetonu.Content-Length
– Yüklediğiniz dosyanın boyutudur. Bu değer, 1. adımdakiX-Upload-Content-Length
HTTP isteği başlığının değeriyle aynı olmalıdır.Content-Type
– Yüklediğiniz dosyanın MIME türü. Bu değer, 1. adımdakiX-Upload-Content-Type
HTTP isteği başlığının değeriyle aynı olmalıdır.
4. Adım - Yükleme işlemini tamamlayın
İsteğiniz aşağıdaki senaryolardan birine yol açar:
-
Yükleme işleminiz başarıyla tamamlandı.
API sunucusu bir HTTP
201
(Created
) yanıt koduyla yanıt veriyor. Yanıtın gövdesi, oluşturduğunuzvideo
kaynağıdır. -
Yükleme işleminiz başarısız oldu ancak devam ettirilebilir.
Yüklemeyi aşağıdaki durumlardan birinde devam ettirebilirsiniz:
-
Uygulamanız ile API sunucusu arasındaki bağlantı kesildiği için isteğiniz kesintiye uğradı. Bu durumda API yanıtı almazsınız.
-
API yanıtı, aşağıdaki
5xx
yanıt kodlarından herhangi birini belirtir. Bu yanıt kodlarından herhangi birini aldıktan sonra, yüklemelerinizi devam ettirirken kodunuzda üstel geri yükleme stratejisi kullanılmalıdır.500
-Internal Server Error
502
-Bad Gateway
503
-Service Unavailable
504
-Gateway Timeout
Yüklemeyi devam ettirmek için aşağıdaki yükleme durumunu kontrol etme ve yüklemeyi devam ettirme talimatlarını uygulayın. Devam ettirilebilen her oturum URI'sının sınırlı bir süresinin olduğunu ve sonunda süresinin dolacağını unutmayın. Bu nedenle, oturum URI'sini alır almaz devam ettirilebilir bir yükleme yapmanızı ve kesinti gerçekleştikten kısa bir süre sonra kesintiye uğrayan bir yüklemeyi devam ettirmenizi öneririz.
-
-
Yüklemeniz kalıcı olarak başarısız oldu.
Başarısız bir yükleme olduğunda yanıt, hatanın nedenini açıklayan bir hata yanıtı içerir. Kalıcı olarak başarısız olan bir yükleme için API yanıtında
4xx
yanıt kodu veya yukarıda listelenenlerin dışında bir5xx
yanıt kodu bulunur.Süresi dolmuş bir oturum URI'sı ile istek gönderirseniz sunucu, bir
404
HTTP yanıt kodu (Not Found
) döndürür. Bu durumda, yeni bir devam ettirilebilir yükleme başlatmanız, yeni bir oturum URI'si almanız ve yeni URI'yi kullanarak yüklemeyi baştan başlatmanız gerekir.
4.1. Adım: Bir yüklemenin durumunu kontrol etme
Kesintili devam ettirilebilir yüklemenin durumunu kontrol etmek için 2. adımda aldığınız ve 3. adımda kullandığınız yükleme URL'sine boş bir PUT isteği gönderin. İsteğinizde, Content-Range
başlık değerini bytes */CONTENT_LENGTH
olarak ayarlayın. Burada CONTENT_LENGTH, yüklediğiniz dosyanın boyutudur.
PUT UPLOAD_URL HTTP/1.1 Authorization: Bearer AUTH_TOKEN Content-Length: 0 Content-Range: bytes */CONTENT_LENGTH
4.2. Adım: API yanıtını işleme
Yükleme tamamlanıp tamamlanmadığına bakılmaksızın, başarılı veya başarısız olmasına bakılmaksızın API, yükleme tamamlandığında gönderilen yanıtı döndürür.
Ancak yükleme işlemi kesintiye uğradıysa veya hâlâ devam ediyorsa API yanıtında HTTP 308
(Resume Incomplete
) yanıt kodu bulunur. Yanıtta Range
başlığı, dosyanın kaç baytını başarılı bir şekilde yüklendiğini belirtir.
- Başlık değeri,
0
dizininden dizine eklenir. Bu nedenle,0-999999
değeri, ilk1,000,000
baytının yüklendiğini gösterir. - Henüz hiçbir şey yüklenmediyse API yanıtı
Range
başlığını içermez.
Aşağıdaki örnek yanıt, devam ettirilebilir yükleme için API yanıtının biçimini göstermektedir:
308 Resume Incomplete Content-Length: 0 Range: bytes=0-999999
API yanıtı Retry-After
başlığını da içeriyorsa yüklemeyi ne zaman devam ettirmeniz gerektiğini belirlemek için ilgili başlığın değerini kullanın.
4.3. Adım: Yükleme işlemine devam edin
Yükleme işlemine devam etmek için, 2. adımda yakalanan yükleme URL'sine başka bir PUT
isteği gönderin. İstek gövdesini, video dosyasının henüz yüklenmeyen kısmıyla ilgili ikili kod olarak ayarlayın.
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
Aşağıdaki HTTP istek başlıklarını ayarlamanız gerekir:
-
Authorization
– İsteğin yetkilendirme jetonu. -
Content-Length
– Henüz yüklenmemiş içeriğin bayt cinsinden boyutu. Bir dosyanın geri kalanını yüklüyorsanızFIRST_BYTE
değeriniTOTAL_CONTENT_LENGTH
değerinden çıkararak bu değeri hesaplayabilirsiniz. Her iki değer deContent-Range
başlığında kullanılır. -
Content-Range
– Dosyanın yüklediğiniz kısmıdır. Başlık değeri üç değerden oluşur:-
FIRST_BYTE
– Yükleme işlemine devam ettiğiniz bayt numarasının 0 tabanlı sayısal dizini. Bu değer, önceki adımda alınanRange
başlığındaki ikinci sayıdan daha yüksek. Önceki örnekte,Range
üst bilgi değeri0-999999
olduğu için sonraki bir devam eden yüklemede ilk bayt1000000
olur. -
LAST_BYTE
– Yüklediğiniz ikili dosyanın son baytının 0 tabanlı sayısal dizini. Genellikle bu dosyadaki son bayttır. Bu nedenle, örneğin dosya boyutu3000000
baytsa dosyadaki son bayt2999999
sayısı olur. -
TOTAL_CONTENT_LENGTH
– Video dosyasının bayt cinsinden toplam boyutudur. Bu değer, orijinal yükleme isteğinde belirtilenContent-Length
başlığıyla aynıdır.
Not: İkili dosyanın sürekli bir blokunu yükleyemezsiniz. Sürekli olmayan bir blok yüklemeye çalışırsanız kalan ikili program içeriklerinin hiçbiri yüklenmez.
Bu nedenle, devam ettirilen bir yüklemede yüklenen ilk bayt, YouTube'a başarıyla yüklenmiş olan son bayttan sonraki sonraki bayt olmalıdır. (4.2. adımdaRange
başlığının konusuyla ilgili tartışmalara göz atın.
Bu nedenle,Range
başlığındaki son baytı999999
ise isteğin devam edeceği ilk bayt 1.000.000 bayt olmalıdır. (Her ikisi de 0 tabanlı bir dizin kullanır.) 999999 ya da daha düşük (baytlar çakışıyor) veya 1000.001 bayt (veya atlanan bayt) bayttan yüklemeyi devam ettirmeye çalışırsanız ikili programdaki içeriklerin hiçbiri yüklenmez. -
Parçalar halinde dosya yükleme
Uygulamanız, bir ağ kesintisi durumunda dosyanın tamamını yüklemeye çalışmak ve yüklemeyi devam ettirmek yerine dosyaları parçalara bölebilir ve parçaları sırayla yükleyebilir. Nadiren gereklidir ve performans üzerinde etki yaratabilecek ek istekler gerektirdiğinden önerilmez. Bununla birlikte, çok kararsız bir ağda ilerleme durumu göstergesi göstermeye çalışıyorsanız bu faydalı olabilir.
Bir dosyayı parçalara yükleme talimatları, bu kılavuzun önceki bölümlerinde açıklanan dört adımlı süreçle neredeyse aynıdır. Ancak bir dosyayı yüklemeye (yukarıdaki 3. adımda) ve yüklemeyi devam ettirmeye (yukarıdaki 4.3. adımda) yapılan istekler, bir dosya parçalara yüklenirken hem Content-Length
hem de Content-Range
başlık değerlerini farklı şekilde ayarlar.
-
Content-Length
başlık değeri, isteğin gönderdiği parçanın boyutunu belirtir. Parça boyutlarıyla ilgili aşağıdaki kısıtlamalara dikkat edin:-
Parça boyutu, 256 KB'ın katı olmalıdır. (Bu kısıtlama, tüm dosya boyutu 256 KB'ın katı olamayacağı için son parça için geçerli değildir.) Daha büyük parçaların daha verimli olduğunu unutmayın.
-
Parça boyutu, son parçanın boyutunu belirten son istek haricinde, yükleme dizisindeki her istek için aynı olmalıdır.
-
-
Content-Range
başlığı, isteğin yüklediği dosyadaki baytları belirtir. Adım 4.3'teContent-Range
üstbilgisini ayarlama talimatları, bu değer ayarlanırken geçerlidir.Örneğin,
bytes 0-524287/2000000
değeri, isteğin 2.000.000 baytlık bir dosyadaki ilk 524.288 baytı (256 x 2.048) gönderdiğini gösterir.
Aşağıdaki örnekte parçalara 2.000.000 baytlık bir dosya yükleyecek bir dizi istek ilkinin biçimi gösterilmektedir:
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}
Son istek dışındaki istekler başarılı olursa API sunucusu 308
(Resume Incomplete
) yanıtıyla yanıt verir. Yanıt biçimi, yukarıdaki 4.2. Adım: API yanıtını işleme bölümünde açıklananla aynıdır.
Bir sonraki parçaya nereden başlayacağınızı belirlemek için API yanıtının Range
başlığında döndürülen üst değeri kullanın. 4.3. Adım: Yüklemeyi devam ettirin bölümünde açıklandığı gibi, dosyanın tamamı yüklenene kadar sonraki dosya parçalarını yüklemek için PUT
istekleri göndermeye devam edin.
Tüm dosya yüklendiğinde sunucu bir 201
HTTP yanıt koduyla (Created
) yanıt verir ve yeni oluşturulan video kaynağının istenen kısımlarını döndürür.
Herhangi bir istek kesintiye uğrarsa veya uygulamanız 5xx
yanıt kodu alırsa, yüklemeyi tamamlamak için 4. adımda açıklanan prosedürü izleyin. Ancak dosyanın geri kalanını yüklemeyi denemek yerine, yüklemeyi devam ettirdiğiniz noktada parçaları yüklemeye devam edebilirsiniz. Dosya yüklemesinin devam edeceği yeri belirlemek için yükleme durumunu kontrol edin. Sunucunun önceki istekte gönderilen baytların tümünü aldığını (veya hiçbirini almadığını) varsaymayın.
Not: Yüklenen parçalar arasında etkin bir yüklemenin durumunu da isteyebilirsiniz. (Durumunu alabilmeniz için yüklemenin kesintiye uğraması gerekmez.)