Google API'leri için devam ettirilebilir yükleme protokolünü kullanarak videoları daha güvenilir bir şekilde yükleyebilirsiniz. Bu protokol, ağ kesintisi veya başka bir aktarım hatası sonrasında yükleme işlemini devam ettirmenize olanak tanır. Böylece ağ hataları durumunda zaman ve bant genişliği tasarrufu sağlar.
Devam ettirilebilir yükleme özelliği özellikle aşağıdaki durumlarda yararlıdır:
- Büyük dosyalar aktarıyorsunuz.
- Ağ kesintisi olasılığı yüksektir.
- Yüklemeler, bant genişliği düşük veya internet bağlantısı kararsız olan bir cihazdan (ör. mobil cihaz) geliyor.
Bu kılavuzda, bir uygulamanın videoları yeniden başlatılabilir bir yükleme işlemi kullanarak yüklemek için gönderdiği HTTP isteklerinin sırası açıklanmaktadır. Bu kılavuz, bazılarında devam ettirilebilir yüklemeler için yerel destek sunan Google API istemci kitaplıklarını kullanamayan geliştiriciler için hazırlanmıştır. YouTube Data API - Video Yükleme kılavuzunda, devam ettirilebilir bir yükleme işlemi kullanarak video yüklemek için Python için Google API'leri istemci kitaplığının nasıl kullanılacağı açıklanmaktadır.
Not: HTTPS günlük kaydının etkin olduğu 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 için HTTP izlemeyi etkinleştirmek üzere 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ının içermesini 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 üstbilgilerini de ayarlayın:
Authorization
: İsteğin yetkilendirme jetonu.Content-Length
: İsteğin gövdesinde sağlanan bayt sayısı. Blok aktarım kodlaması kullanıyorsanız bu üstbilgiyi sağlamanız gerekmez.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/*
) veyaapplication/octet-stream
MIME türüne sahip dosyalar yükleyebilirsiniz.
Aşağıdaki örnekte, video yüklemek için devam ettirilebilir bir oturumun nasıl başlatılacağı gösterilmektedir. İstek, video
kaynağının snippet
ve status
bölümlerindeki özellikleri ayarlar (ve alır) ve ayrıca kaynağın contentdetails
bölümündeki özellikleri de 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ç tüm bu değerlerin doldurulduğu 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ıtta, devam ettirilebilir oturumun URI'sini belirten bir Location
HTTP üst bilgisi bulunur. Bu, video dosyanızı yüklemek için kullanacağınız URI'dir.
Aşağıdaki örnekte, 1. adımdaki istek için ö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
API yanıtından oturum URI'sini çıkardıktan sonra, gerçek video dosyası içeriğini bu konuma yüklemeniz gerekir. İsteğin gövdesi, yüklediğiniz videonun ikili program dosyası 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 boyutu. 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
Talebiniz aşağıdaki senaryolardan birine yol açar:
-
Yükleme işleminiz başarılı oldu.
API sunucusu, HTTP
201
(Created
) yanıt koduyla yanıt verir. Yanıtın gövdesi, oluşturduğunuzvideo
kaynağıdır. -
Yükleme işleminiz tamamlanamadı ancak devam ettirilebilir.
Aşağıdaki durumlarda yüklemeyi devam ettirebilirsiniz:
-
Uygulamanız ile API sunucusu arasındaki bağlantı kesildiğinden isteğiniz kesintiye uğrar. Bu durumda API yanıtı almazsınız.
-
API yanıtı, aşağıdaki
5xx
yanıt kodlarından birini belirtir. Kodunuz, bu yanıt kodlarından herhangi birini aldıktan sonra yüklemeleri devam ettirirken eksponansiyel geri yükleme stratejisi kullanmalıdır.500
-Internal Server Error
502
-Bad Gateway
503
-Service Unavailable
504
-Gateway Timeout
Bir yüklemeyi devam ettirmek için aşağıdaki yüklemenin durumunu kontrol etme ve yüklemeyi devam ettirme talimatlarını uygulayın. Devam ettirilebilir her oturum URI'sinin sonlu bir ömrü olduğunu ve zaman içinde süresinin dolacağını unutmayın. Bu nedenle, oturum URI'sini alır almaz devam ettirilebilir bir yükleme başlatmanızı ve kesinti oluştuktan kısa bir süre sonra kesintiye uğrayan yüklemeyi devam ettirmenizi öneririz.
-
-
Yüklemeniz kalıcı olarak başarısız oldu.
Başarısız bir yükleme için yanıtta, başarısızlığın nedenini açıklamaya yardımcı olan bir hata yanıtı bulunur. Kalıcı olarak başarısız olan yüklemeler için API yanıtında, yukarıda listelenenler dışında bir
4xx
yanıt kodu veya5xx
yanıt kodu bulunur.Süresi dolmuş bir oturum URI'si içeren bir istek gönderirseniz sunucu
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: Yüklemenin durumunu kontrol edin
Kesintiye uğramış ve devam ettirilebilir bir yüklemenin durumunu kontrol etmek için 2. adımda aldığınız ve 3. adımda da 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 işlemi tamamlandıysa (başarılı veya başarısız olmasına bakılmaksızın) API, yükleme işlemi ilk kez tamamlandığında gönderdiği yanıtı döndürür.
Ancak yükleme kesintiye uğradıysa veya hâlâ devam ediyorsa API yanıtında HTTP 308
(Resume Incomplete
) yanıt kodu bulunur. Yanıtta, Range
üstbilgisi, dosyanın kaç baytının başarıyla yüklendiğini belirtir.
- Üstbilgi değeri
0
ile dizine eklenir. Bu nedenle,0-999999
olan bir başlık değeri, dosyanın ilk1,000,000
baytının yüklendiğini gösterir. - Henüz hiçbir şey yüklenmediyse API yanıtı
Range
üstbilgisini içermez.
Aşağıdaki örnek yanıtta, devam ettirilebilir yükleme için API yanıtının biçimi gösterilmektedir:
308 Resume Incomplete Content-Length: 0 Range: bytes=0-999999
API yanıtı Retry-After
üstbilgisini de içeriyorsa yüklemeyi ne zaman devam ettirmeye çalışacağınızı belirlemek için bu üstbilginin değerini kullanın.
4.3. adım: Yüklemeyi devam ettirin
Yüklemeyi devam ettirmek 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üklenmemiş kısmının ikili koduna 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 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ı. Başlık değeri üç değerden oluşur:-
FIRST_BYTE
: Yüklemeyi devam ettirdiğiniz bayt sayısının 0 tabanlı sayısal dizini. Bu değer, önceki adımda alınanRange
başlığındaki ikinci sayıdan bir sayı daha yüksektir. Yukarıdaki örnekte,Range
başlığı0-999999
değerine sahipti. Bu nedenle, devam eden bir sonraki yüklemenin ilk baytı1000000
olacaktır. -
LAST_BYTE
: Yüklediğiniz ikili program dosyasının son baytının 0 tabanlı sayısal dizini. Bu genellikle dosyadaki son bayttır. Örneğin, dosya boyutu3000000
bayt ise dosyadaki son bayt2999999
sayısı olur. -
TOTAL_CONTENT_LENGTH
: Video dosyasının bayt cinsinden toplam boyutu. Bu değer, orijinal yükleme isteğinde belirtilenContent-Length
başlığıyla aynıdır.
Not: İkili dosyanın kesintisiz olmayan bir bloğunu yükleyemezsiniz. Devamlı olmayan bir blok yüklemeye çalışırsanız kalan ikili içeriklerin hiçbiri yüklenmez.
Bu nedenle, devam ettirilen bir yüklemede yüklenen ilk bayt, YouTube'a başarıyla yüklenen son bayttan sonraki bayt olmalıdır. (Range
başlığıyla ilgili tartışmayı 4.2. adımda bulabilirsiniz.
Bu nedenle,Range
başlığındaki son bayt999999
ise yüklemeyi devam ettirme isteğinde ilk bayt 1000000 baytı olmalıdır. (Her iki sayı da 0 tabanlı bir dizin kullanır.) Yüklemeyi 999999. bayttan veya daha düşük bir bayttan (örtüşen baytlar) ya da 1000001. bayttan veya daha yüksek bir bayttan (atlanan baytlar) devam ettirmeye çalışırsanız ikili içeriklerin hiçbiri yüklenmez. -
Dosyaları parçalara ayırarak yükleme
Uygulamanız, dosyanın tamamını yüklemeye çalışmak ve ağ kesintisi durumunda yüklemeyi devam ettirmek yerine dosyayı parçalara ayırabilir ve parçaları sırayla yüklemek için bir dizi istek gönderebilir. Bu yaklaşım nadiren gereklidir ve performansla ilgili etkileri olan ek istekler gerektirdiği için aslında önerilmez. Ancak, çok kararsız bir ağda ilerleme göstergesi göstermeye çalışıyorsanız bu yöntem yararlı olabilir.
Bir dosyayı parçalara ayırarak 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 dosyanın parçalara ayrılarak yüklenmesi durumunda, dosya yükleme işlemini başlatma (yukarıdaki 3. adım) ve yükleme işlemine devam etme (yukarıdaki 4.3. adım) isteklerinin her ikisi de Content-Length
ve 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ın katı olmalıdır. (Dosyanın tamamının boyutu 256 KB'nın katı olmayabileceğinden bu kısıtlama son parça için geçerli değildir.) Daha büyük parçaların daha verimli olduğunu unutmayın.
-
Son parçanın boyutunu belirten son istek hariç olmak üzere, yükleme sırasındaki her istek için parça boyutu aynı olmalıdır.
-
-
Content-Range
üstbilgisi, istek tarafından yüklenen dosyanın baytlarını belirtir. Bu değeri ayarlarken 4.3. adımdaContent-Range
başlığını ayarlama talimatları geçerlidir.Örneğin,
bytes 0-524287/2000000
değeri, isteğin 2.000.000 baytlık bir dosyanın ilk 524.288 baytını (256 x 2048) gönderdiğini gösterir.
Aşağıdaki örnekte, 2.000.000 baytlık bir dosyayı parçalara ayırarak yükleyecek bir istek serisinin 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}
Nihai istek dışındaki bir istek başarılı olursa API sunucusu 308
(Resume Incomplete
) yanıtı ile 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ı olacaktır.
Sonraki parçanın nereden başlayacağını belirlemek için API yanıtının Range
başlığında döndürülen üst değeri kullanın. Dosyanın tamamı yüklenene kadar sonraki dosya parçalarını yüklemek için 4.3. Adım: Yüklemeyi devam ettirin bölümünde açıklandığı gibi PUT
istekleri göndermeye devam edin.
Dosyanın tamamı yüklendiğinde sunucu, 201
HTTP yanıt koduyla (Created
) yanıt verir ve yeni oluşturulan video kaynağının istenen bölümlerini 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ü uygulayın. Ancak, dosyanın geri kalanını yüklemeye çalışmak yerine, yüklemeyi devam ettirdiğiniz noktadan itibaren parçaları yüklemeye devam edin. Dosya yüklemenin nereden devam ettirileceğini belirlemek için yüklemenin durumunu kontrol ettiğinizden emin olun. Sunucunun önceki istekte gönderilen baytların tamamını (veya hiçbirini) aldığını varsaymayın.
Not: Yüklenen parçalar arasında etkin bir yüklemenin durumunu da isteyebilirsiniz. (Yüklemenin durumunu alabilmek için yüklemenin kesintiye uğramış olması gerekmez.)