2010-04-30 31 views
34

Quiero validar identificadores de video de youtube publicados en la URL de uno de mis sitios antes de acceder a la API de Youtube, pero no sé cuáles son los caracteres permitidos en dicha identificación. Veo gente en la red adivinando que puede contener números y caracteres, pero aún no he visto una especificación oficial de estos identificadores de video.¿Cómo validar identificadores de video de youtube?

¿Hay uno?

Respuesta

51

Ver this thread para información oficial.

que puede golpear esto: http://gdata.youtube.com/feeds/api/videos/VIDEO_ID

y determinar si el vídeo es válida basándose en la respuesta

No hay manera de que puede comprobar la validez de la identificación con expresiones regulares, ya que no todos los valores alfanuméricos son ID válidos.

p.s. estoy bastante seguro de haber visto "guiones" en las identificaciones de video

p.p.s. "Subrayado" es un carácter válido también: http://www.youtube.com/watch?v=nrGk0AuFd_9

[a-zA-Z0-9 _-] {11} es la expresión regular (source), pero no hay garantía de que el video estará allí incluso si es válida la expresión regular

+0

Si desea comprobar si la URL está activa, aquí hay un ejemplo en ruby: http://www.igvita.com/2006/09/07/validating-url-in-ruby-on-rails/ – borisrorsvort

+1

Esto ya no aparece trabajar. http://gdata.youtube.com/feeds/api/videos/NOT_A_VIDEO_ID devuelve 200 OK. – nornagon

+0

Vea mi respuesta más abajo que cubre una solución para V3 de la API – richwol

1

Solo busco ver si es alfanumérico con posible guión o no. Es posible que desee examinar OEmbed, puede consultar YouTube para ver si el ID es un video válido o no.

+1

guiones (guiones) también están permitidos en los ID de vídeo de YouTube. –

6

Resolví este problema de la misma manera que Roman recomendó. En mi ayudante:

Asegúrese de incluir su requiere en la parte superior del archivo:

require "net/http" 
require "uri" 

continuación:

def validate_id(youtube_id) 
    uri = URI.parse("http://gdata.youtube.com/feeds/api/videos/#{ youtube_id }") 
    http = Net::HTTP.new(uri.host, uri.port) 
    request = Net::HTTP::Get.new(uri.request_uri) 
    response = http.request(request) 
    %Q{ #{response.code} } 
end 

Sé que no hay ningún espacio en blanco entre los soportes en "# {} response.code"

Por último, la comparan con la respuesta deseada:

def youtube_data(youtube_id) 
    if validate_id(youtube_id) == "200" 
    #video is good code 
    else %Q{ Video is no longer valid } 
    end 
end 
6

Si está buscando una solución más rápida y escalable, yo diría usar REGEX con un poco de registro/repliegue para que los errores sean proactivos si youtube cambia su ID en el futuro.

He estado trabajando con la API de YouTube desde hace un tiempo se trata de millones de videos , de enlace a través de ellos he encontrado que este es el más ideal:

/^[A-Za-z0-9_-]{11}$/ 

Un ejemplo más detallado dicen en PHP :

public static function validId($id) { 
    return preg_match('/^[a-zA-Z0-9_-]{11}$/', $id) > 0; 
} 
+3

¿No debería ser eso ' AZ' y no 'Az'. –

0

Aquí es una sencilla aplicación del enfoque de romano en PHP:

function validYoutube($id){ 
    $id = trim($id); 
    if (strlen($id) === 11){ 
     $file = @file_get_contents('http://gdata.youtube.com/feeds/api/videos/'.$id); 
     return !!$file; 
    } 
    return false; 
} 

Y aquí están las pruebas:

echo validYoutube('Nv7U6_WhqvQ'); 
echo validYoutube('Nv7U6_Whqvf'); 
echo validYoutube('Nv7U6_Whqzz'); 
+1

ya no es compatible, esta era la API anterior v2. v3 es ahora el estándar. – FlavorScape

11

Con v3 de la API de YouTube que he logrado esto llamando:

GET https://www.googleapis.com/youtube/v3/videos?part=id&id=Tr5WcGSDqDg&key= {YOUR_API_KEY}

Esto devuelve algo como:

{ 
    "kind": "youtube#videoListResponse", 
    "etag": "\"dc9DtKVuP_z_ZIF9BZmHcN8kvWQ/P2cGwKgbH6EYZAGxiKCZSH8R1KY\"", 
    "pageInfo": { 
    "totalResults": 1, 
    "resultsPerPage": 1 
}, 
"items": [ 
    { 
     "kind": "youtube#video", 
     "etag": "\"dc9DtKVuP_z_ZIF9BZmHcN8kvWQ/Rgd0_ApwigPcJHVX1Z2SIQ5FJtU\"", 
     "id": "Tr5WcGSDqDg" 
    } 
] 

}

lo que sólo puede hacer una comprobación:

if(json.totalResults===1) { 
    if(items[0].kind==='youtube#video') { 
     //valid video ID 
    } 
} 
+2

Esto ahora es necesario ya que v2 de la API ya no funciona. He estado buscando por todas partes esto, gracias. – Adam

+0

No hay problema, me alegro de poder ayudar :) – richwol

-2

uso simple este código:

public class HelloWorld{ 

    public static void main(String []args){ 

    String expression = "^.*((youtu.be"+ "\\/)" + "|(v\\/)|(\\/u\\/w\\/)|(embed\\/)|(watch\\?))\\??v?=?([^#\\&\\?]*).*"; // var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/; 

    String video_url = "https://www.youtube.com/watch?v=as3tGTN2u98"; 

    if (video_url.matches(expression)) { 
     System.out.println("It's valid"); 
    } 


} 

} 
+1

Esto es solo una suposición al azar. También OP no ha declarado que está usando Java – lokusking

Cuestiones relacionadas