web-dev-qa-db-ja.com

サムネイルのYouTube画像を自動取得しますか?

YouTubeに埋め込まれたHTMLスニペット、タイトル、およびおすすめの画像を受け入れるカスタム投稿タイプがあります。現在、注目の画像の画像を探していますが、投稿自体の保存処理中に、動画のURLに基​​づいて動画の最初のフレーム自体を自動的にダウンロードしてサイズを変更できるのが理想的です。うまくいけば、私の投稿タイプはリンク以外に何も必要とせず、そこから画像と埋め込みコードを取得することができます。

たとえば、ビデオリンクが http://www.youtube.com/watch?v=2Jnpi-uBiIg の場合、 v の値が抽出され、でイメージのダウンロードに使用されます。 http://img.youtube.com/vi/2Jnpi-uBiIg/0.jpg

私はワードプレスの開発にはとても慣れていませんが、フックを調べようとしていることがわかります(それらを正しく理解していれば)。

6
Sampson

こんにちは@Jonathan Sampson:

これは必ずしもあなたが要求したものではありませんが、実際には実行可能な解決策であり、WordPress.comから無料で入手できます。 @yoast

基本的にあなたはこの形式でWordPress.comのスクリーンショットジェネレータURLを使うことができます (ブログ記事によると Matt 無料の使用を祝福するように思われました):

  • https://s.wordpress.com/mshots/v1/{URL-encoded URL}?w={width}

上からURLを取得します。

そしてスクリーンショットジェネレータで使うことができるようにURLエンコーディングをすると、このようなURLが得られます (幅400ピクセルの場合):

https://s.wordpress.com/mshots/v1/http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D2Jnpi-uBiIg?w=400

そしてもちろんスクリーンショットは次のようになります 私は後世のためにスクリーンショットをコピーしましたので画像を表示するためのサービスへの直接リンクを含まずにWordPressサービスが変更されても変わりません) なぜページ全体ではなくビデオがスナップされたのかわからないが、ビデオはあなたが望むものにとってさらに優れている:

Screenshot of a Youtube Video as snapped by WordPress Screenshot Service 
(出典: mikeschinkel.com

もちろん、最初にHTTP GETを要求したときには、スクリーンショットは返されません。これは、WordPress.comのサーバーが最初にスクリーンショットをキャプチャする必要があるためです。そのため、最初のリクエストでHTTP GETはこのURLにリダイレクトされます。

  • https://s.wordpress.com/wp-content/plugins/mshots/default.gif

そのURLにこの画像が表示されます。

Generating Preview Image from WordPress.com

しかし、あなたがあなたの最初のHTTP GETリクエストの後に少し待って、そして再びそのリクエストを発行するならば、あなたはあなたのスクリーンショットを見つけるでしょう。私の考えは、あなたがそれをキャッシュするためにそれを呼び出すこと、それをダウンロードすることを待ってそれからあなた自身のサーバー上でローカルにキャッシュすることであるということです。これを無料で提供する あるいは、十分なトラフィックがあれば有料サービスとしても提供でき、有料のAPI機能も追加できる可能性もある ) -

Ps.ところで、実際にWebページ内で動作することを証明するのは、WordPress.comから直接要求されたスクリーンショットです。これは、上で保存してリンクしたスクリーンショットとは異なる場合があります。または、誰かがこのページを閲覧してからキャッシュが明らかになって "Generating Preview" イメージになる場合もあります。その場合は、しばらく待ってからこのページを更新してください。

Screenshot of a Youtube Video directly from WordPress.com Screenshot service

6
MikeSchinkel

私のビデオブログポストジェネレータ(http://v.leau.co/)はこれを行いますが、wpコンテキストでは行いません。

あなたはクエリを提供します。 "スーパーマン"(そしてそれが何かをしていることに気付かずに)(そして唯一のユーザーであるから)待って、そしてあなたが投稿したいVIDをクリックし、コードを生成をクリックする。その間にダウンロードしました。このコードはコピーして投稿に貼り付けることができます。

言い換えれば、あなたがコードを関数呼び出しに入れるならば、それはコード片を返すでしょう。コンテンツに追加される動画へのリンクを持つhref、またはローカルにダウンロードされた注目の画像へのリンク。

それはあなたが探しているコードの一部ですか?私はコアがあると思います:

より多くの結果を取得する機能(結果として得られるコードに1つの特定のビデオではなく複数のビデオを表示するだけの場合はergo):

function retrieveMoreResults($key, $q, $start, $cache) {
$url = "http://ajax.googleapis.com/ajax/services/search/video?v=1.0&q=" . $q . "&rsz=large&start=" . $start. "&key=" . $key;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_REFERER, $referer);
$body = curl_exec($ch);
curl_close($ch);
$responseData = json_decode($body, true);   
$tempOutputString .= display($responseData, $cache, $q);
return $tempOutputString;
}

初期結果ページを取得するための関数:

function retrieveResults($key, $q, $cache) {    
# first call
$url = "http://ajax.googleapis.com/ajax/services/search/video?v=1.0&q=" . $q . "&rsz=large&key=" . $key;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_REFERER, $referer);
$body = curl_exec($ch);
curl_close($ch);
$responseData = json_decode($body, true);   
$tempOutputString = "";
$tempOutputString .= display($responseData, $cache, $q);

$boolFirstRequest = true;
foreach ($responseData["responseData"]["cursor"]["pages"] as $GsearchResultClass) { 
    $start = $GsearchResultClass["start"];
    if ($boolFirstRequest) {
        $boolFirstRequest = false;
    } else {
        $tempOutputString .= retrieveMoreResults($key, $q, $start, $cache);
    }
}
return $tempOutputString;
}

特定のディレクトリ(変数)のサムをダウンロードして表示し、投稿に入れるコードを返す機能。

function display($responseData, $cache, $tag) {
$strBuffer="";

foreach ($responseData["responseData"]["results"] as $GsearchResultClass) {

    #
    # there are YouTube urls and also Google Video urls they are both different
    # the one from Google video has the Word "ThumbnailServer" in it
    # example:
    # youtube: http://1.gvt0.com/vi/6jKzr143K8U/default.jpg
    # video.google: http://3.gvt0.com/ThumbnailServer2?app=vss&contentid=7efbd69963e4cc67&offsetms=30000&itag=w160&hl=en&sigh=J6N1fv_It6H5jJWX51fKt-eYqNk
    #
    $thumbId="";
    $imageThumb=$GsearchResultClass["tbUrl"];
    if (strstr($imageThumb, 'ThumbnailServer')) {
        $imgStringBits = explode('&',$imageThumb);
        $parsedImgStr=strstr($imgStringBits[1],'=');
        $parsedImgStr = substr($parsedImgStr,1);
        $thumbId = $parsedImgStr;
    } else {
        $imgStringBits = explode('/',$imageThumb);
        $thumbId = $imgStringBits[4];
    }
    $imgFile=$cache . "/" . $thumbId . ".jpg";

    #
    # Now that we have the imageFile Name check if we already have it in the cache:
    # - if we have it NEVER delete it (why should we?)
    # - if we dont well... get it via curl
    #
    if (!file_exists($imgFile)) {
        $ch = curl_init ();
        $timeout = 5;
        curl_setopt ($ch, CURLOPT_USERAGENT,  'Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9) Gecko/2008052906 Firefox/3.0');
        curl_setopt ($ch, CURLOPT_AUTOREFERER, true);
        curl_setopt ($ch, CURLOPT_URL, $imageThumb);
        curl_setopt ($ch, CURLOPT_HEADER, false);
        curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
        curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt ($ch, CURLOPT_BINARYTRANSFER, true);
        curl_setopt ($ch, CURLOPT_VERBOSE, 1);
        $rawdata = curl_exec ($ch);
        curl_close ($ch);
        if($rawdata) {          
            $fp = fopen($imgFile, 'w');
            fwrite($fp, $rawdata);
            fclose($fp);
        } else {
            #
            # If our Curl action retrieves nothing then use the default image
            #
            $imgfile="images/default.jpg";
        }
    }

    #
    # Now that we have the image url create a div (hmm.. might drop that
    # styling later on in a seperate csss) containg the video thumb, link
   # and the description. When you like it you can add all the other
    # parameters that Google returns like length etc...
    #
    $strBuffer .=  "<div style=\"float:left;width:125px;height:130px;font-size:8px;font-family:arial;\" class=\"thumb\"><div>";
    $strBuffer .=  "<a href=\"#\" class=\"del\" id=\"$thumbId\"> ADD</a><br />";                
    $strBuffer .=  "<a href=\"" .  $GsearchResultClass["playUrl"]  .    "\" target=\"_blank\">";
    $strBuffer .=  "<img src=\"" . $imgFile . "\" alt=\"" . $GsearchResultClass["title"] . "\" border=\"0\" width=\"120\">";
    $strBuffer .=  "</a><br />\n";
    #
    # Note that we also add a delete option, for now that only removes it from the page
    # but in the next version it should do an AJAX call to write the id somewhere so
    # that we never see it again.
    #
    $strBuffer .= $GsearchResultClass["titleNoFormatting"] . "<br />";
    $strBuffer .= "</div></div>\n";
}
return $strBuffer;
}

上記を呼び出すための関数:

function moviePage($tag, $cacheName, $cacheTime, $key) { 
$cache = $cacheName . "/" . $tag;
checkCache($cache);
cleanCacheHTML($cache);

$filename = $tag . ".html";
$spFile=$cache . "/" . $filename;

if (file_exists($spFile) && filemtime($spFile) > $cacheTime ) {
    $strBuffer = file_get_contents($spFile) . "<!-- " . $spFile . " from cache -->";
} else {                    
    $strBuffer = retrieveResults($key, $tag, $cache);
}
$strBuffer .=  "<br clear=\"all\">";
$fp = fopen($spFile, 'w');
fwrite($fp, $strBuffer);
fclose($fp);

return $strBuffer;  
}

($キーはあなたのGoogle APIキーです)(http://code.google.com/intl/nl-NL/more/)

私見残りはもっと単に "返されたものを手に入れてそれを投稿の内容に追加する+ダウンロードされたキャッシュされた親指を特集として設定すること?"

P.S YouTubeでは、古い動画は削除されることが多く、結果として見苦しい投稿を残すため、YouTube動画を参照するときは、動画にサムネイルを投稿することをお勧めします。あなた自身の親指で少なくとも画像は永遠にそこに留まるので、後であなたはもともとそこに投稿したものの手がかりを得ることができます。

3
edelwater

私が正確にあなたが何を意味するのか理解したかどうかはわかりませんが、私はこの回避策を見つけました:

http://wpworks.wordpress.com/2010/12/23/display-youtube-thumbnail-with-wordpress-custom-field/ /

宜しくお願いします

2
Alvaro Neto

URLを元に画像を表示する機能は?これはあなたが念頭に置いていたようなことですか?

function get_youtube_screen( $url = '', $type = 'default', $echo = true ) {
    if( empty( $url ) )
        return false;

    if( !isset( $type ) )
        $type = '';

    $url = esc_url( $url );

    preg_match("|[\\?&]v=([^&#]*)|",$url,$vid_id);

    if( !isset( $vid_id[1] ) )
        return false;

    $img_server_num =  'i'. Rand(1,4);

    switch( $type ) {
        case 'large':
            $img = "<img src=\"http://{$img_server_num}.ytimg.com/vi/{$vid_id[1]}/0.jpg\" />";
            break;
        case 'first':
            // Thumbnail of the first frame
            $img = "<img src=\"http://{$img_server_num}.ytimg.com/vi/{$vid_id[1]}/1.jpg\" />";
            break;
        case 'small':
            // Thumbnail of a later frame(i'm not sure how they determine this)
            $img = "<img src=\"http://{$img_server_num}.ytimg.com/vi/{$vid_id[1]}/2.jpg\" />";
            break;
        case 'default':
        case '':
        default:
            $img = "<img src=\"http://{$img_server_num}.ytimg.com/vi/{$vid_id[1]}/default.jpg\" />";
            break;
    }
    if( $echo )
        echo $img;
    else
        return $img;

}
// Example calls

get_youtube_screen( "http://www.youtube.com/watch?v=dZfmPREbTd8", 'default' );

get_youtube_screen( "http://www.youtube.com/watch?v=dZfmPREbTd8", 'large' );

get_youtube_screen( "http://www.youtube.com/watch?v=dZfmPREbTd8", 'small' );

get_youtube_screen( "http://www.youtube.com/watch?v=dZfmPREbTd8", 'first' );

YouTubeは、サムネイル用にいくつかのサーバー用の画像を提供しているようです。

iN.ytimg.com

Nは通常1〜4の数値です(5が、テストでは矛盾していました)。

彼らはまたimg.youtube.comを使いますが、私は交互のサーバーからフェッチするという考えが好きでした、それで私は画像を表示するために4つのサーバーから1つを無作為に選ぶ機能をコード化しました。

注: すべてのビデオのサイズごとにイメージがあるとは限りません。空白のイメージが表示されることもありますが、デフォルトのイメージはテストしたビデオURLで一貫して機能するようです。

それが役立つかどうかを教えてください。

1
t31os