API Youtube-ID de vidéo D'extraction

JE CODE une fonctionnalité qui permet aux utilisateurs d'entrer une URL Vidéo Youtube. J'aimerais extraire l'ID de la vidéo de ces urls.

est-ce que L'API Youtube supporte une sorte de fonction où je passe le lien et il donne L'ID de la vidéo en retour. Ou dois-je analyser la ficelle moi-même?

j'utilise PHP ... Je vous saurais gré de me donner des conseils ou des exemples de codes à cet égard.

Merci

30
demandé sur hakre 2011-07-02 14:51:36

8 réponses

voici un exemple de fonction qui utilise une expression régulière pour extraire l'ID youtube d'une URL:

/**
 * get youtube video ID from URL
 *
 * @param string $url
 * @return string Youtube video id or FALSE if none found. 
 */
function youtube_id_from_url($url) {
    $pattern = 
        '%^# Match any youtube URL
        (?:https?://)?  # Optional scheme. Either http or https
        (?:www\.)?      # Optional www subdomain
        (?:             # Group host alternatives
          youtu\.be/    # Either youtu.be,
        | youtube\.com  # or youtube.com
          (?:           # Group path alternatives
            /embed/     # Either /embed/
          | /v/         # or /v/
          | /watch\?v=  # or /watch\?v=
          )             # End path alternatives.
        )               # End host alternatives.
        ([\w-]{10,12})  # Allow 10-12 for 11 char youtube id.
        $%x'
        ;
    $result = preg_match($pattern, $url, $matches);
    if ($result) {
        return $matches[1];
    }
    return false;
}

echo youtube_id_from_url('http://youtu.be/NLqAF9hrVbY'); # NLqAF9hrVbY

c'est une adoption de la réponse à une question similaire .


ce N'est pas directement L'API que vous recherchez mais probablement utile. Youtube a un oembed service:

$url = 'http://youtu.be/NLqAF9hrVbY';
var_dump(json_decode(file_get_contents(sprintf('http://www.youtube.com/oembed?url=%s&format=json', urlencode($url)))));

qui fournit des méta-informations supplémentaires à propos de L'URL:

object(stdClass)#1 (13) {
  ["provider_url"]=>
  string(23) "http://www.youtube.com/"
  ["title"]=>
  string(63) "Hang Gliding: 3 Flights in 8 Days at Northside Point of the Mtn"
  ["html"]=>
  string(411) "<object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/NLqAF9hrVbY?version=3"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/NLqAF9hrVbY?version=3" type="application/x-shockwave-flash" width="425" height="344" allowscriptaccess="always" allowfullscreen="true"></embed></object>"
  ["author_name"]=>
  string(11) "widgewunner"
  ["height"]=>
  int(344)
  ["thumbnail_width"]=>
  int(480)
  ["width"]=>
  int(425)
  ["version"]=>
  string(3) "1.0"
  ["author_url"]=>
  string(39) "http://www.youtube.com/user/widgewunner"
  ["provider_name"]=>
  string(7) "YouTube"
  ["thumbnail_url"]=>
  string(48) "http://i3.ytimg.com/vi/NLqAF9hrVbY/hqdefault.jpg"
  ["type"]=>
  string(5) "video"
  ["thumbnail_height"]=>
  int(360)
}

mais la carte D'identité ne fait pas directement partie de la réponse. Cependant, il pourrait contenir les informations que vous recherchez et il pourrait être utile de valider L'URL youtube.

79
répondu hakre 2017-05-23 12:34:29

je fais de légers changements dans l'expression régulière ci-dessus, bien que cela fonctionne très bien pour youtube short URL (qui ont été utilisés dans l'exemple ci-dessus) et simple video URL où aucun autre paramètre ne vient après le code Vidéo, mais il ne fonctionne pas pour les URLs comme http://www.youtube.com/watch?v=B_izAKQ0WqQ&feature=related comme code Vidéo n'est pas le dernier paramètre de cette URL. De la même manière, v={video_code} ne vient pas toujours après watch (alors qu'au-dessus l'expression régulière suppose qu'elle viendra toujours après la montre?), comme si l'Utilisateur a choisi la langue ou l'emplacement du pied de page, par exemple si l'Utilisateur a choisi l'anglais (UK) de l'option de langue alors URL sera http://www.youtube.com/watch?feature=related&hl=en-GB&v=B_izAKQ0WqQ

donc j'ai fait quelques modifications dans les expressions régulières ci-dessus, mais certainement le crédit va à hakre pour fournir l'expression régulière de base, merci @hakre:

function youtube_id_from_url($url) {
   $pattern =
    '%^# Match any youtube URL
    (?:https?://)?  # Optional scheme. Either http or https
    (?:www\.)?      # Optional www subdomain
    (?:             # Group host alternatives
      youtu\.be/    # Either youtu.be,
    | youtube\.com  # or youtube.com
      (?:           # Group path alternatives
        /embed/     # Either /embed/
      | /v/         # or /v/
      | .*v=        # or /watch\?v=
      )             # End path alternatives.
    )               # End host alternatives.
    ([\w-]{10,12})  # Allow 10-12 for 11 char youtube id.
    ($|&).*         # if additional parameters are also in query string after video id.
    $%x'
    ;
    $result = preg_match($pattern, $url, $matches);
    if (false !== $result) {
      return $matches[1];
    }
    return false;
 }
18
répondu Sabeeh Chaudhry 2012-05-29 07:51:50

vous pouvez utiliser la fonction PHP parse_url pour extraire le nom d'hôte, le chemin, la chaîne de requête et le fragment. Vous pouvez alors utiliser les fonctions de chaîne de caractères PHP pour localiser l'id de la vidéo.

function getYouTubeVideoId($url)
{
    $video_id = false;
    $url = parse_url($url);
    if (strcasecmp($url['host'], 'youtu.be') === 0)
    {
        #### (dontcare)://youtu.be/<video id>
        $video_id = substr($url['path'], 1);
    }
    elseif (strcasecmp($url['host'], 'www.youtube.com') === 0)
    {
        if (isset($url['query']))
        {
            parse_str($url['query'], $url['query']);
            if (isset($url['query']['v']))
            {
                #### (dontcare)://www.youtube.com/(dontcare)?v=<video id>
                $video_id = $url['query']['v'];
            }
        }
        if ($video_id == false)
        {
            $url['path'] = explode('/', substr($url['path'], 1));
            if (in_array($url['path'][0], array('e', 'embed', 'v')))
            {
                #### (dontcare)://www.youtube.com/(whitelist)/<video id>
                $video_id = $url['path'][1];
            }
        }
    }
    return $video_id;
}
$urls = array(
    'http://youtu.be/dQw4w9WgXcQ',
    'http://www.youtube.com/?v=dQw4w9WgXcQ',
    'http://www.youtube.com/?v=dQw4w9WgXcQ&feature=player_embedded',
    'http://www.youtube.com/watch?v=dQw4w9WgXcQ',
    'http://www.youtube.com/watch?v=dQw4w9WgXcQ&feature=player_embedded',
    'http://www.youtube.com/v/dQw4w9WgXcQ',
    'http://www.youtube.com/e/dQw4w9WgXcQ',
    'http://www.youtube.com/embed/dQw4w9WgXcQ'
);
foreach ($urls as $url)
{
    echo sprintf('%s -> %s' . PHP_EOL, $url, getYouTubeVideoId($url));
}
10
répondu Salman A 2013-01-04 11:26:25

Simple comme retour substr(strstr($url, 'v='), 2, 11);

1
répondu dctremblay 2014-09-27 09:55:05

je sais que c'est une réponse très tardive, mais j'ai trouvé ce fil en cherchant le sujet, donc je veux suggérer une façon plus élégante de le faire en utilisant oEmbed :

echo get_embed('youtube', 'https://www.youtube.com/watch?v=IdxKPCv0bSs');

function get_embed($provider, $url, $max_width = '', $max_height = ''){
    $providers = array(
        'youtube' => 'http://www.youtube.com/oembed'
        /* you can add support for more providers here */
    );

    if(!isset($providers[$provider])){
        return 'Invalid provider!';
    }

    $movie_data_json = @file_get_contents(
        $providers[$provider] . '?url=' . urlencode($url) . 
        "&maxwidth={$max_width}&maxheight={$max_height}&format=json"
    );

    if(!$movie_data_json){
        $error = error_get_last();
        /* remove the PHP stuff from the error and show only the HTTP error message */
        $error_message = preg_replace('/.*: (.*)/', '', $error['message']);
        return $error_message;
    }else{
        $movie_data = json_decode($movie_data_json, true);
        return $movie_data['html'];
    }
}

oEmbed permet d'intégrer du contenu à partir de plusieurs sites en ajoutant simplement leur paramètre API oEmbed au tableau $providers dans le code ci-dessus.

1
répondu A. Genedy 2015-04-02 07:03:27

Voici une solution simple qui a fonctionné pour moi.

VideoId est le mot le plus long dans tous les types D'URL YouTube et il comprend (alphanumérique+" -") avec une longueur minimale de 8 entouré de caractères non-mot. Vous pouvez donc rechercher ci-dessous regex dans L'URL en tant que groupe et ce premier groupe est votre réponse. Premier groupe parce que certains paramètres youtube tels que enablejsapi sont plus de 8 caractères mais ils viennent toujours après videoId.

Regex: " \W ([\w -] {9,}) (\W/$)"

voici le code java de travail:

String[] youtubeUrls = {
    "https://www.youtube.com/watch?v=UzRtrjyDwx0",
    "https://youtu.be/6butf1tEVKs?t=22s",
    "https://youtu.be/R46-XgqXkzE?t=2m52s",
    "http://youtu.be/dQw4w9WgXcQ",
    "http://www.youtube.com/?v=dQw4w9WgXcQ",
    "http://www.youtube.com/?v=dQw4w9WgXcQ&feature=player_embedded",
    "http://www.youtube.com/watch?v=dQw4w9WgXcQ",
    "http://www.youtube.com/watch?v=dQw4w9WgXcQ&feature=player_embedded",
    "http://www.youtube.com/v/dQw4w9WgXcQ",
    "http://www.youtube.com/e/dQw4w9WgXcQ",
    "http://www.youtube.com/embed/dQw4w9WgXcQ"
};

String pattern = "\W([\w-]{9,})(\W|$)";
Pattern pattern2 = Pattern.compile(pattern);

for (int i=0; i<youtubeUrls.length; i++){
    Matcher matcher2 = pattern2.matcher(youtubeUrls[i]);
    if (matcher2.find()){
        System.out.println(matcher2.group(1));
    }
    else System.out.println("Not found");
}
1
répondu Devinder Singh 2015-06-13 11:20:07

comme mentionné dans un commentaire ci-dessous la réponse valide, nous l'utilisons comme ceci, et il fonctionne très bien!

function youtube_id_from_url($url) {

$url = trim(strtok("$url", '?'));
$url = str_replace("#!/", "", "$url");

    $pattern = 
        '%^# Match any youtube URL
        (?:https?://)?  # Optional scheme. Either http or https
        (?:www\.)?      # Optional www subdomain
        (?:             # Group host alternatives
          youtu\.be/    # Either youtu.be,
        | youtube\.com  # or youtube.com
          (?:           # Group path alternatives
            /embed/     # Either /embed/
          | /v/         # or /v/
          | /watch\?v=  # or /watch\?v=
          )             # End path alternatives.
        )               # End host alternatives.
        ([\w-]{10,12})  # Allow 10-12 for 11 char youtube id.
        $%x'
        ;
    $result = preg_match($pattern, $url, $matches);
    if ($result) {
        return $matches[1];
    }
    return false;
}
1
répondu KJS 2016-12-09 22:46:20

Que pensez-vous de celui-ci:

function getVideoId() {
    $query = parse_url($this->url, PHP_URL_QUERY);

    $arr = explode('=', $query);

    $index = array_search('v', $arr);

    if ($index !== false) {
        if (isset($arr[$index++])) {
            $string = $arr[$index++];
            if (($amp = strpos($string, '&')) !== false) {
                return substr($string, 0, $amp);
            } else {
                return $string;
            }
        } else {
            return false;
        }
    }
    return false;
}

Pas de regex, prendre en charge plusieurs paramètres de requête, j'.e, https://www.youtube.com/watch?v=PEQxWg92Ux4&index=9&list=RDMMom0RGEnWIEk fonctionne aussi.

0
répondu petwho 2015-10-14 15:47:47