2011-11-29 6 views
8

से यूट्यूब वीडियो यूआरएल हथियाने, तो, मैं एक php प्रोजेक्ट पर काम कर रहा हूं और इसका एक हिस्सा यूट्यूब वीडियो यूआरएल पकड़ रहा है और इसे एचटीएमएल 5 वीडियो टैग में डालने वाला है। मैं http://youtube.com/get_video_info?video_id=XXX पर एक कर्ल कॉल का उपयोग कर रहा था और अपनी स्थानीय मशीन पर सही वीडियो फ़ाइल यूआरएल प्राप्त कर रहा था।कर्ल या get_video_info

लेकिन, जब मैंने अपने वेब सर्वर पर अपना कोड अपलोड किया और इसे चलाने की कोशिश की, तो वीडियो यूआरएल में से कोई भी काम नहीं कर पाया है। यूआरएल ठीक लग रहा था लेकिन आईपी जैसे कुछ पैरामीटर, जहां अलग हैं। मैं समझ नहीं पा रहा हूं कि यह मेरी स्थानीय मशीन से चल रहा है क्यों xampp या mamp चल रहा है लेकिन मेरे वेब सर्वर पर नहीं। मैंने यूट्यूब वीडियो पेज पर सिर्फ एक कर्ल करने की कोशिश की और देखा कि स्थानीय रूप से, यह पृष्ठ को आउटपुट करेगा और वीडियो चलाएगा लेकिन मेरे वेबसर्वर पर, सभी वीडियो कॉल 404 मिलेंगे।

इस बारे में कोई जानकारी? वैसे भी मैं एक यूट्यूब वीडियो यूआरएल पकड़ सकता हूं ताकि मैं एक एचटीएमएल 5 वीडियो टैग में यूट्यूब वीडियो चला सकूं? क्या यही कारण है कि keepvid और साइटें इस तरह के जावा जावा एप्लेट का उपयोग करें?

+0

जब से तुम 404 हो रही है, क्या यूआरएल इस्तेमाल किया गया था? क्या आप जानकारी और मिलान डेटा लाने के लिए कुछ उदाहरण कोड पोस्ट कर सकते हैं? – drew010

+0

क्या यूट्यूब आपको ऐसी चीजों को करने की अनुमति नहीं दे रहा है? –

+0

यह वास्तव में 403 है, आप इसे इस यूआरएल में देख सकते हैं: http://oo.preferred.iad09s12.v5.lscache8.c.youtube.com/videoplayback?sparams=id,expire,ip,ipbits,itag,source , ratebypass सीपी और fexp = 907911,914060,916201 और itag = 43 & आईपी = 208.0.0.0 और हस्ताक्षर = 1810EA75ADD7E30581426A5262C030CF82348A98।5C2D5385C0DD8FCFCF46EF43BD7223C894825DB6 और sver = 3 और ratebypass = हाँ और स्रोत = यूट्यूब और समय सीमा समाप्त = +१३२२६२९२०० और कुंजी yt1 और ipbits = 8 और cp = U0hRR1ZNV19FSkNOMV9OR0FDOlBIZnZ0Zl9jdXNF और आईडी = 1c8acc21e379b6d1 और गुणवत्ता = मध्यम और fallback_host = tc.v5.cache8.c.youtube.com & type = वीडियो/webm – iwek

उत्तर

-3

शायद scraping यूट्यूब एक अच्छा विचार नहीं है, तो आप सरकारी एपीआई के एक नज़र डालनी चाहिए: http://code.google.com/apis/youtube/overview.html

"डेटा API" लगता है कि तुम क्या जरूरत है।

+1

यूट्यूब एपीआई है जहां मैंने पहले देखा है और मुझे वीडियो फ़ाइलों को यूआरएल को पुनर्प्राप्त करने के तरीके को वैसे भी नहीं दिख रहा है http://youtube.com/get_video_info?video_id=XXX – iwek

10

आपको youtube-dl प्रोजेक्ट पर एक नज़र रखना चाहिए, मुझे पूरा यकीन है कि आप अपने लक्ष्य को प्राप्त करने के उचित तरीके को समझने के लिए कुछ विचार ले सकते हैं।

+0

ठीक है, मैंने अभी इसे जांच लिया है और इसका परीक्षण किया है और यह बहुत अच्छा काम करता है लेकिन मुझे आश्चर्य है कि वे इसे कैसे करते हैं। मुझे अजगर नहीं पता, क्या वे get_video_info का उपयोग करते हैं? – iwek

+0

यदि आपको पायथन नहीं पता है, तो मुझे लगता है कि आप जानते हैं [grep] (http://en.wikipedia.org/wiki/Grep) या [ack] (http://betterthangrep.com/);) –

+0

ठीक है, grep का उपयोग करके मैं देखता हूं कि वे get_video_info का उपयोग करते हैं और यह मेरे PHP कोड के समान है। दूसरे शब्दों में, वे यूआरएल स्थानीय रूप से काम करते हैं लेकिन सर्वर पर नहीं। चूंकि फ़ाइल सर्वर पर डाउनलोड होती है, मुझे लगता है कि यह ब्राउज़र आईपी के साथ एक समस्या है। स्थानीय रूप से मेरा ब्राउज़र मेरी स्थानीय मशीन जैसा ही है, लेकिन यह तब नहीं है जब मैं अपने सर्वर से किसी पेज को हिट करने के लिए अपने ब्राउज़र का उपयोग करता हूं। इसलिए, यूआरएल मेरे सर्वर के लिए सही है, यही कारण है कि यह काम करता है और डाउनलोड करता है, लेकिन अंतिम उपयोगकर्ता के रूप में, वह यूआरएल गलत है। कोई अन्य विचार? – iwek

6

मैंने हाल ही में क्लिनेट में यूट्यूब वीडियो स्ट्रीम करने के लिए PHP में एक स्क्रिप्ट बनाई है और मुझे लगता है कि मेरी स्क्रिप्ट का थोड़ा सा हिस्सा आपके उद्देश्य को फिट कर सकता है।

<?php 
@set_time_limit(0); //disable time limit to make sure the whole video is streamed to the client 
$id = $_GET['id']; //the youtube video ID 
$type = $_GET['type']; //the MIME type of the desired format 

parse_str(file_get_contents('http://www.youtube.com/get_video_info?video_id='.$id),$info); //get video info 
$streams = explode(',',$info['url_encoded_fmt_stream_map']); //split the stream map into streams 

foreach($streams as $stream){ 
    parse_str($stream,$real_stream); //parse the splitted stream 
    $stype = $real_stream['type']; //the MIME type of the stream 
    if(strpos($real_stream['type'],';') !== false){ //if a semicolon exists, that means the MIME type has a codec in it 
     $tmp = explode(';',$real_stream['type']); //get rid of the codec 
     $stype = $tmp[0]; 
     unset($tmp); 
    } 
    if($stype == $type && ($real_stream['quality'] == 'large' || $real_stream['quality'] == 'medium' || $real_stream['quality'] == 'small')){ //check whether the format is the desired format 
     header('Content-type: '.$stype); //send the HTTP headers 
     header('Transfer-encoding: chunked'); //necessary for streaming 
     @readfile($real_stream['url'].'&signature='.$real_stream['sig']); //send the content to the client 
     ob_flush(); //disable PHP caching 
     flush(); //flush the content out 
     break; 
    } 
} 
?> 

मुझे आशा है कि यह आपकी मदद कर सकते हैं:

यहाँ मेरी PHP स्क्रिप्ट है।

पीएस आपको सर्वर से सामग्री भेजने की आवश्यकता है क्योंकि वीडियो यूआरएल आईएसपी द्वारा भिन्न होता है।

+0

यह काम करता है लेकिन किसी के पास पास्कल/डेल्फी में समान कोड है? – Artem

2

जो लिंक आप निकालेंगे वह केवल आईपी पते के लिए काम करता है जिससे आपने इसे निकाला था। इसलिए, यदि आप इसे अपनी स्थानीय मशीन से निकालते हैं, तो यह आपके मशीन पर ब्राउज़र में काम करेगा। हालांकि, अगर आप इसे अपने सर्वर से निकालते हैं, तो केवल सर्वर ही उस लिंक से वीडियो फ़ाइल तक पहुंच पाएगा।

1

आप डाउनलोड यूट्यूब वीडियो के लिए इस कोड का उपयोग कर सकते हैं:

<?php 
$id='5HDw7sQE2H0'; 
$dt=file_get_contents("http://www.youtube.com/get_video_info?video_id=$id&el=embedded&ps=default&eurl=&gl=US&hl=en"); 
$x=explode("&",$dt); 
$t=array(); $g=array(); $h=array(); 
echo "<pre>\r\n"; 
foreach($x as $r){ 
    $c=explode("=",$r); 
    $n=$c[0]; $v=$c[1]; 
    $y=urldecode($v); 
    $t[$n]=$v; 
} 
$streams = explode(',',urldecode($t['url_encoded_fmt_stream_map'])); 
foreach($streams as $dt){ 
    $x=explode("&",$dt); 
    foreach($x as $r){ 
     $c=explode("=",$r); 
     $n=$c[0]; $v=$c[1]; 
     $h[$n]=urldecode($v); 
    } 
    $g[]=$h; 
} 
print_r($g); 
echo "\r\n</pre>"; 
?> 
+1

उपर्युक्त कोड अब और काम नहीं करता है। – Hassaan

+0

आपको शायद – LZH

+0

पर काम करने के लिए हस्ताक्षर जोड़ने की आवश्यकता है लाइन 10 पर, '$ y' का कभी भी उपयोग नहीं किया जाता है। मुझे लगता है कि लाइन 11 के लिए लिखने के लिए आपको क्या मतलब था $ $ [$ n] = urldecode ($ v) '। या फिर, '$ तालिका [$ name] = urldecode ($ value) ', जिसके कारण आपके सिर पर बंदूक है, जिससे आप एक-एक अक्षर परिवर्तनीय नामों का उपयोग कर सकते हैं? –

0

आप बस वीडियो आईडी से एक एम्बेड यूआरएल का निर्माण कर सकते

बड़ा लाभ यहाँ है कि आप करने के लिए अपने स्वयं के पैरामीटर जोड़ सकते हैं आवश्यकतानुसार खिलाड़ी।

उदाहरण एक iframe src के लिए,

http://www.youtube.com/embed/ {$ video_id}? विषय = प्रकाश & ऑटोप्ले = 1 & ...