自動取得Youtube影片的縮圖

之前做過一個影片管理系統,大概的功能就是將youtube的影片嵌入碼給存起來,當然還有影片的標題、說明等等資料欄位。通常這樣子的功能還會有個列表,列表按習慣是希望有個縮圖可以來檢索,就好像youtube裡的呈現樣子。以前的作法是在上傳表單裡額外再提供一個欄位,用來存放縮圖的網址及檔名之用。最近查看了youtube本身的縮圖網址,發現它有規則可依循,我們就很容易可以透過程式來自動取得影片縮圖。所以底下就來說明如何自動取得youtube的影片縮圖路徑。

首先先來看看影片的嵌入碼,目前youtube的嵌入碼是使用iframe的標籤,另有一種舊的語法是使用object標籤,以下分別是新版語法及舊版語法:

新版影片嵌入碼
1
<iframe src="http://www.youtube-nocookie.com/embed/8hS_2xj6RXE" width="420" height="315" frameborder="0" allowfullscreen="allowfullscreen"></iframe>
舊版影片嵌入碼
1
2
3
4
5
6
<object width="420" height="315">
    <param name="movie" value="http://www.youtube.com/v/&lt;strong&gt;8hS_2xj6RXE&lt;/strong&gt;?version=3&amp;amp;hl=zh_TW&amp;amp;rel=0" />
    <param name="allowFullScreen" value="true" />
    <param name="allowscriptaccess" value="always" />
    <embed src="http://www.youtube.com/v/8hS_2xj6RXE?version=3&amp;amp;hl=zh_TW&amp;amp;rel=0" type="application/x-shockwave-flash" width="420" height="315" allowscriptaccess="always" allowfullscreen="allowfullscreen" />
</object>

其中上述加粗的字串是影片的識別碼,只要能夠取得此識別碼,要取得縮圖就很簡單了。我用以下的語法來取得影片識別碼,其中$movieCode代表影片嵌入碼,利用preg_match搭配下列的正規語法取得影片識別碼後,將它存在$movieID[‘mv’]這個變數裡,正規語法裡?P<mv>就是為代表影片識別碼的subpattern命名之用。

preg_match(‘#(?:http|https)://www.youtube(?:-nocookie)*.com/(?:embed|v)/(?P<mv>[^&?”]+)#’,$movieCode,$movieID);

取得影片的縮圖

影片縮圖的基本路徑是:http://i3.ytimg.com/vi/影片識別碼/default.jpg

所以我們將取得的影片識別碼放在上述路徑的位置,即可取得該影片的縮圖。另外,i3經測試,它可以是i1i4這範圍的字串,它們的結果都是一樣,所以我們可以直接選擇一個來使用就可以了。

這個縮圖路徑在影片識別碼不存在,或無效的情況下會自動提供一個共用圖片,如下圖。還蠻貼心的,這樣我們就不用自己再額外做判別了。

縮圖不存在上述是youtube針對影片縮圖的作法,因為它有提供一個便利方式,就是單靠影片識別碼即可取影片縮圖,所以我們可以透過上述語法操作,但其他影片空間似乎沒有這麼便利的作法,所以似乎暫時還不能夠利用程式來自動取得縮圖。

設定影片寬度、高度

通常影片的嵌入碼會有一個預設的高度、寬度,有時候這個預設的大小會導致網頁的版面破版或是混亂,所以我們可能希望讓程式來控制影片的大小。我們可以利用preg_match(‘/width=”(\d{3,4})”/’,$movieCode,$width)來取得影片的寬度,而$width[1]就是影片的寬度(要取得高度就將width換成height就可以了,高度會存放到$height[1])。

接著要指定新的寬度,我們用$new_width來代表。然後我們再取得新寬度與舊寬度的比例($new_width/$width[1]),這個比例是要來取得新高度之用。所以新高度就是$new_height=intval(($new_width/$width[1])*$height[1])。

之後再將舊的寬度、高度以新的來取代即可,語法是:

$new_movieCode=preg_replace(array(‘/width=”(‘ . $width[1] . ‘)”/’ , ‘/height=”(‘ . $height[1] . ‘)”/’) , array(‘width=”‘ . $new_width . ‘”‘ , ‘height=”‘ . $new_height . ‘”‘) ,$movieCode)

其中$new_movieCode就是代表新寬度、高度的影片嵌入碼。

 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

Proudly using Dynamic Headers by Nicasio WordPress Design