How to generate a featured image from a video embeded in a metabox

There are a few steps you need to cover.

  1. Get ID from MetaBox embed
  2. Pull list of available sizes based on ID
  3. Import image into your library if doesn’t already exist
  4. Attach new file to post.

STEP 2 | YouTube

Generate an array of sizes from YouTube to use later:

function getYoutTubeImagesFromID($yt_id, $prefix = 'https:') {

    $yt_url="img.youtube.com"; //  can be 'i3.ytimg.com'

    $sizes = array(0, 1, 2, 3, "default", "hqdefault", "mqdefault", "sddefault", "maxresdefault");
    $result = array();
    foreach($sizes as $size) {
        $result [ $size ] = "{$prefix}//img.youtube.com/vi/{$yt_id}/{$size}.jpg";
    }

    return array(
        'id'    => $yt_id,
        'link'  => "{$prefix}//youtu.be/{$yt_id}",
        'sizes' => $result,
    );
}

To test this out, loop through a list of IDS.

$yt_videos = array('cV5yxrZpuXg', 'LtBTHqi8Gmw', 'VEAY-nRlP5c', 'IWeasYydL8Y', 'fCVXpcR9KDY');

foreach($yt_videos as $yt_id) {

    $ytImages = getYoutTubeImagesFromID($yt_id);

    $src = $ytImages[ 'sizes' ][ 'hqdefault' ];
    $link = $ytImages[ 'link' ];

    echo "<a href=\"{$link}\" target=\"_blank\" ><img src=\"{$src}\" ></a>";

    print_r($ytImages);
}

They should each produce size information you can use for your import.

Array
(
    [id] => cV5yxrZpuXg
    https://wordpress.stackexchange.com/questions/213355/how-to-generate-a-featured-image-from-a-video-embeded-in-a-metabox => https://youtu.be/cV5yxrZpuXg
    [sizes] => Array
        (
            [0] => https://img.youtube.com/vi/cV5yxrZpuXg/0.jpg
            [1] => https://img.youtube.com/vi/cV5yxrZpuXg/1.jpg
            [2] => https://img.youtube.com/vi/cV5yxrZpuXg/2.jpg
            [3] => https://img.youtube.com/vi/cV5yxrZpuXg/3.jpg
            [default] => https://img.youtube.com/vi/cV5yxrZpuXg/default.jpg
            [hqdefault] => https://img.youtube.com/vi/cV5yxrZpuXg/hqdefault.jpg
            [mqdefault] => https://img.youtube.com/vi/cV5yxrZpuXg/mqdefault.jpg
            [sddefault] => https://img.youtube.com/vi/cV5yxrZpuXg/sddefault.jpg
            [maxresdefault] => https://img.youtube.com/vi/cV5yxrZpuXg/maxresdefault.jpg
        )

)

STEP 2 | Vimeo

Gather Vimeo video information

function getVimeoImagesFromID($vimeo_id, $prefix = 'https:') {

    $vimeo_url = "{$prefix}//vimeo.com/api/v2/video/{$vimeo_id}.php";

    if( ! $vimeo_hash = @file_get_contents($vimeo_url)) {
        return false;
    }

    $result = unserialize($vimeo_hash);

    return ( count($result) === 1 ) ? array_shift($result) : $result;
}

// your vimeo id 
$vimeo_id = 71472926;

// get available information for video
if($vimeo_hash = getVimeoImagesFromID($vimeo_id)) {

    // grab the largest image possible
    $vimeo_src = $vimeo_hash [ 'thumbnail_large' ];

    echo $vimeo_src; // https://i.vimeocdn.com/video/445043557_640.jpg
}

STEP 3 | Sideload Image

media_sideload_image the image from YT to your sever. Be sure to grab the thumbnail_id from the resulting src.

// your youtube id
$yt_id = 'cSXlOeKusWs';

// size information for id
$ytImages = getYoutTubeImagesFromID($yt_id);

// max res image
$url = $ytImages[ 'sizes' ][ 'maxresdefault' ];

// sideload image
$src = media_sideload_image(esc_url($url), NULL, '', 'src');

// convert src to id
$thumbnail_id = attachment_url_to_postid($src);

STEP 4 | Attach Post Thumbnail

set_post_thumbnail based on the new thumbnail_id.

set_post_thumbnail( $post, $thumbnail_id );