2010-04-30 7 views
34

Ich möchte Youtube-Video-IDs in der URL zu einer meiner Websites bestätigen, bevor ich auf die Youtube-API zugreife, aber ich weiß nicht, welche zulässigen Zeichen in einer solchen ID enthalten sind. Ich sehe Leute im Internet, die davon ausgehen, dass sie Zahlen und Zeichen enthalten können, aber ich habe noch keine offizielle Spezifikation dieser Video-IDs gesehen.Wie validieren Sie YouTube Video-IDs?

Gibt es eins?

Antwort

51

Für offizielle Informationen siehe this thread.

können Sie diese getroffen: http://gdata.youtube.com/feeds/api/videos/VIDEO_ID

und bestimmen, ob das Video gültig ist, basierend auf Antwort

Es gibt keine Möglichkeit, die Gültigkeit der ID mit RegEx überprüfen, da nicht alle alphanumerischen Werte gültige IDs.

p.s. Ich bin mir ziemlich sicher, ich sah "Bindestriche" in Video-IDs

pp. "Unterstrich" ist ein gültiges Zeichen auch: http://www.youtube.com/watch?v=nrGk0AuFd_9

[a-zA-Z0-9 _-] {11} ist die regex (source), aber es gibt keine Garantie, dass das Video da sein wird, auch wenn Regex gültig ist

+0

Wenn Sie überprüfen möchten, ob URL live ist, hier ein Beispiel in Ruby: http://www.igvita.com/2006/09/07/validating-url-in-ruby-on-rails/ – borisrorsvort

+1

Dies wird nicht mehr angezeigt arbeiten. http://gdata.youtube.com/feeds/api/videos/NOT_A_VIDEO_ID gibt 200 OK zurück. – nornagon

+0

Siehe meine Antwort weiter unten, die eine Lösung für V3 der API behandelt – richwol

1

Ich schaue nur, ob es alphanumerisch mit möglichen Strich ist oder nicht. Vielleicht möchten Sie in oEmbed nachsehen, Sie können YouTube fragen, ob die ID ein gültiges Video ist oder nicht.

+1

Bindestriche (Bindestriche) auch in YouTube Video-IDs erlaubt. –

6

Ich löste dieses Problem in der gleichen Weise Roman empfohlen. In meinem Helfer:

Seien Sie sicher, dass Ihre erfordert am Anfang der Datei enthalten:

require "net/http" 
require "uri" 

Dann:

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 

Seien Sie sicher, dass es zwischen den Klammern in „# kein weißer Raum {response.code}“

Schließlich vergleichen, um es in die gewünschte Reaktion:

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

Wenn Sie nach einer schnelleren und besser skalierbaren Lösung suchen, würde ich sagen, dass Sie REGEX mit einigem Logging/Fallback verwenden, damit Fehler proaktiv werden, wenn youtube ihre ID in der Zukunft ändert.

ich für eine Weile habe mit Millionen von Videos jetzt den Umgang mit dem YouTube-API arbeiten, durch sie Looping i dies die ideale erwiesen:

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

Ein detaillierteres Beispiel sagen in PHP :

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

Sollte das nicht 'sein AZ' und nicht 'AZ'. –

0

Hier ist eine einfache Implementierung des Ansatzes des Romans in 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; 
} 

Und hier sind die Tests:

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

nicht mehr unterstützt, das war die alte v2 api. v3 ist jetzt der Standard. – FlavorScape

11

Mit v3 der YouTube API ich dies telefonisch erreicht:

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

Das gibt so etwas wie:

{ 
    "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" 
    } 
] 

}

So können Sie einfach einen Scheck:

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

Dies ist jetzt notwendig, da v2 der API nicht mehr funktioniert. Ich habe überall nach diesem gesucht, danke. – Adam

+0

Kein Problem, froh, ich könnte helfen :) – richwol

-2

Einfache Anwendung diesen Code:

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

Dies ist nur eine zufällige Schätzung. Auch OP hat nicht gesagt, dass er Java benutzt – lokusking