2014-05-23 39 views
5

如果圖像是404,但是主機會返回圖像,會發生圖像錯誤回調嗎?Broken Youtube縮略圖不會觸發錯誤回調

我想在客戶端提交URL到服務器之前確定Youtube縮略圖是否有效。通常情況下,你可以生成一個縮略圖URL不與格式查詢自己的API http://img.youtube.com/vi/**ID**/maxresdefault.jpg

有些視頻沒有高分辨率的縮略圖,例如,這一個: http://img.youtube.com/vi/ty62YzGryU4/maxresdefault.jpg

然而,低質量縮略圖總是存在: http://img.youtube.com/vi/ty62YzGryU4/default.jpg

理想我想能夠檢測到通過此代碼段,這會叫「做」,當它加載一個有效的縮略圖縮略圖是否做負載:

var id = "ty62YzGryU4" 
var tries = 0 
var thumb = "http://img.youtube.com/vi/" + id + "/maxresdefault.jpg" 
var img = new Image() 
img.onload = function(){ console.log('ok'); done(id, thumb) } 
img.onerror = function(){ 
    switch (tries++){ 
     case 0: 
      img.src = thumb = "http://img.youtube.com/vi/" + id + "/hqdefault.jpg" 
      break; 
     case 1: 
      img.src = thumb = "http://img.youtube.com/vi/" + id + "/default.jpg" 
      break; 
     case 2: 
      done(id, thumb) 
      break; 
    } 
} 
img.src = thumb 
if (img.complete) img.onload() 

然而情況並非如此 - 雖然我在控制檯中看到404錯誤,但onload和onerror回調函數都不會觸發,因此從不會調用done

如果我設置了img.crossOrigin = "Anonymous",onerror回調觸發了...針對每個縮略圖,因爲可恥的跨源資源共享策略。

我也試圖起草一個XMLHttpRequest,但無濟於事:

xmlhttp = new XMLHttpRequest() 
xmlhttp.onreadystatechange = function() { 
    console.log(xmlhttp.readyState) 
    console.log(xmlhttp.status) 
}; 
xmlhttp.open('GET', url, true); 
xmlhttp.send(null); 

無論我設置X-Requested-With: XMLHttpRequest與否,readyState的去從14但狀態始終是零!

有沒有什麼方法可以看到這個特定的圖像是否給404沒有使用API​​?

+1

我會檢查firefox的live http頭文件或類似於chrome中的檢查器的內容,但最後你會使用api。 - juuuuuelz桑塔納 – pepper

回答

0

YouTube縮略圖不會觸發onerror()函數,因爲YouTube會發送另一個base64 gif圖像,該圖像顯示分辨率爲120X90的空視頻圖標。 (這是解決方案的關鍵)

請注意,您應該使用maxresdefault圖像加載圖像標記,併爲它或(他們)指定某個類,例如, 「YouTube的拇指」。

對於信息:maxresdefault 1080,sddefault 720,hqdefault 480,mqdefault 360,默認240

根據有限的實驗,0.jpg是480或可用於視頻的最佳低分辨率圖像。

 $(function() 
     { 

     $('.youtube-thumb').each(function(ix, it){ 

      if($(it)[0].naturalHeight <= 90) 
      { 
      var path = $(it).attr('src'); 
      var altpath = path.replace('maxresdefault.jpg','0.jpg'); 

      $(it).attr('src', altpath); 
      } 


     }); 

    });