Skip to content

Instantly share code, notes, and snippets.

@egyjs
Last active April 17, 2024 06:38
Show Gist options
  • Save egyjs/9e60f1ae3168c38cc0f0054c15cd6a83 to your computer and use it in GitHub Desktop.
Save egyjs/9e60f1ae3168c38cc0f0054c15cd6a83 to your computer and use it in GitHub Desktop.
PHP API To get Direct Link of YouTube videos
<?php
/*
Made by [egyJs.com](https://www.instagram.com/egyjs/);
v2.0
*/
header('Access-Control-Allow-Origin: *');
header('Content-Type: application/json');
function get_error($ErrorExaction){
$myObj = new stdClass();
$myObj->error = true;
$myObj->msg = $ErrorExaction;
$myObj->madeBy = "A.El-zahaby";
$myObj->instagram = "egy.js";
$myJSON = json_encode($myObj,JSON_PRETTY_PRINT);
echo $myJSON;
exit;
}
function get_log($dump){
if (isset($_GET['log'])) var_dump($dump).'\n\n\n';
}
if(isset($_GET['url']) && $_GET['url'] != ""){
parse_str( parse_url( $_GET['url'], PHP_URL_QUERY ), $vars );
$id=$vars['v'];
$dt=file_get_contents("https://www.youtube.com/get_video_info?video_id=$id&el=embedded&ps=default&eurl=&gl=US&hl=en");
if (strpos($dt, 'status=fail') !== false) {
$x=explode("&",$dt);
$t=array(); $g=array(); $h=array();
foreach($x as $r){
$c=explode("=",$r);
$n=$c[0]; $v=$c[1];
$y=urldecode($v);
$t[$n]=$v;
}
$x=explode("&",$dt);
foreach($x as $r){
$c=explode("=",$r);
$n=$c[0]; $v=$c[1];
$h[$n]=urldecode($v);
}
$g[]=$h;
$g[0]['error'] = true;
$g[0]['instagram'] = "egy.js";
$g[0]['apiMadeBy'] = 'El-zahaby';
echo json_encode($g,JSON_PRETTY_PRINT);
}else{
$x=explode("&",$dt);
$t=array(); $g=array(); $h=array();
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']));
// if(empty($streams[0])){ get_error('ops! this video has something wrong! :( '); }
if(empty($streams[0])){
get_log($streams);
}
foreach($streams as $dt){
$x=explode("&",$dt);
foreach($x as $r){
$c=explode("=",$r);
if ($c[0] == 'itag'){ // reference: https://superuser.com/q/1386658
switch ($c[1]){
case '18':
$h['mimeType'] = "mp4";
$h['width'] = "640";
$h['height'] = "360";
$h['qualityLabel'] = '360p';
break;
case '22':
$h['mimeType'] = "mp4";
$h['width'] = "1280";
$h['height'] = "720";
$h['qualityLabel'] = '720p';
break;
case '43':
$h['mimeType'] = "webm";
$h['width'] = "640";
$h['height'] = "360";
$h['qualityLabel'] = '360p';
break;
default:
$h['mimeType'] = null;
$h['width'] = null;
$h['height'] = null;
$h['qualityLabel'] = '';
}
}
$n=$c[0]; /* => */ $v=$c[1];
$h[$n]=urldecode($v);
}
$g[]=$h;
}
echo json_encode($g,JSON_PRETTY_PRINT);
// var_dump( $g[1]["quality"],true);
}
}else{
get_error("Ops, there is no youtube link!");
}
@Stephane961
Copy link

Stephane961 commented Jan 1, 2020

Fantastic tool!
I'm trying to load it using a developer tool that cannot run javascript..
Unfortunately I get errors..
How can I get the JSON output already being generated so I can GATHER it in a non javascript tool?

thank you!

Stephane

(I'm using http://youlink.epizy.com/?url=https://www.youtube.com/watch?v=[ID])

@quyleanh
Copy link

quyleanh commented Jan 9, 2020

It's seems that the script is broken. @el3zahaby

@inthinks
Copy link

i can not download anymore from youtube since today, there is an error "Undefined index: url_encoded_fmt_stream_map"

@GavHern
Copy link

GavHern commented Jan 18, 2020

i can not download anymore from youtube since today, there is an error "Undefined index: url_encoded_fmt_stream_map"

I think the way this goes is youtube keeps patching this api from working and then OP fixes it... Not a really reliable system but not much you can do when you're using an API that breaks terms of service...

@lhuxman-lhux
Copy link

parse_str(file_get_contents("https://www.youtube.com/get_video_info?video_id=N-1IiYkrvgE&asv=3&el=detailpage&hl=en_US"),$info);
$streams = $info['player_response'];
$jsn_str=str_replace("\u0026","&",$streams);
$streamin_data_json=json_decode($jsn_str, true);
foreach ($streamin_data_json["streamingData"]["adaptiveFormats"] as $stream) {

parse_str($stream["cipher"],$dturl);
echo $dturl['url'].'
';
}

@GavHern
Copy link

GavHern commented Jan 28, 2020

parse_str(file_get_contents("https://www.youtube.com/get_video_info?video_id=N-1IiYkrvgE&asv=3&el=detailpage&hl=en_US"),$info,$info));
$streams = $info['player_response'];
$jsn_str=str_replace("\u0026","&",$streams);
$streamin_data_json=json_decode($jsn_str, true);
foreach ($streamin_data_json["streamingData"]["adaptiveFormats"] as $stream) {

parse_str($stream["cipher"],$dturl);
echo $dturl['url'].'
';
}

The link sends me here...
image

I think there's some param you need that can be found in the youtube video player. (Here's someone who completly reverse engineered this api (if you'd even call it that).)[https://tyrrrz.me/blog/reverse-engineering-youtube]. I think this is missing the sts param, as it is called in his blog.

@egyjs
Copy link
Author

egyjs commented Jan 28, 2020

@lhuxman-lhux

my code

https://gist.github.com/lhuxman-lhux/bade6474d6b4616d29594541a9e11888

this is really good work ,, i will fork it and improve it if you don't mind

@lhuxman-lhux
Copy link

oke, no problem

@egyjs
Copy link
Author

egyjs commented Jan 28, 2020

no audio i any video @lhuxman-lhux

@lhuxman-lhux
Copy link

first url,

@egyjs
Copy link
Author

egyjs commented Jan 28, 2020

first url,

i did not understand this

@GavHern
Copy link

GavHern commented Feb 2, 2020

first url,

i did not understand this

I'm playing around with lhuxman-lhux's script and starting to figure it out... Not every itag is working in his code (he says it's still in development). The ones that are working for me are 299, 251, 313, 137, 248. You can see what those itags correspond to within his switch statement at the top of the script. There are more of them that work, but the ones I listed are for 1080p60, 1080p, 360p, and 4k.

Also, @lhuxman-lhux do you mind if I also fork this? This is really well made.

@lhuxman-lhux
Copy link

first url,

i did not understand this

I'm playing around with lhuxman-lhux's script and starting to figure it out... Not every itag is working in his code (he says it's still in development). The ones that are working for me are 299, 251, 313, 137, 248. You can see what those itags correspond to within his switch statement at the top of the script. There are more of them that work, but the ones I listed are for 1080p60, 1080p, 360p, and 4k.

Also, @lhuxman-lhux do you mind if I also fork this? This is really well made.

please contact me:
lhuxman19@gmail.com

@Maadhav
Copy link

Maadhav commented May 15, 2020

@GavHern
Copy link

GavHern commented May 15, 2020

image
Why I am getting no response.
Entered URL: http://youlink.epizy.com/?url=https://www.youtube.com/watch?v=QIKv7j0bTyM

Yeah the API doesn't seem to be working anymore... There arent any good alternatives I could find either...

@Maadhav
Copy link

Maadhav commented May 16, 2020

So after all the research, I have done, I found a better solution and implemented and hosted it on Heroku...
Link: https://maadhav-ytdl.herokuapp.com/
Please let me know if any more features are needed. Thanks.
I hope it helps all others...

@GavHern
Copy link

GavHern commented May 16, 2020

So after all the research, I have done, I found a better solution and implemented and hosted it on Heroku...
Link: https://maadhav-ytdl.herokuapp.com/
Please let me know if any more features are needed. Thanks.
I hope it helps all others...

This is really good, great work! Is it, by chance, open source? I may be able to add if the video has audio or not. I'd have to look at some old code of mine and see...

Edit: nevermind, seems like you got that already implemented. Might I suggest the "format" be an array just to make things easier?

@Maadhav
Copy link

Maadhav commented May 16, 2020

Thanks! I have given the source code just below the title.
Anyway: https://github.com/Maadhav/youtube-downloader-API

@GavHern
Copy link

GavHern commented May 16, 2020

Thanks! I have given the source code just below the title.
Anyway: https://github.com/Maadhav/youtube-downloader

Cool man! Big ups for making this.

@FashionCStar
Copy link

@Maadhav
I just tried with the package you built.

$yt = new YouTubeDownloader();

$links = $yt->getDownloadLinks("https://www.youtube.com/watch?v=LJzCYSdrHMI");

var_dump($links); exit;

I am getting array(0) {} as a result.

How can I get working url with above url ?

@yosun
Copy link

yosun commented Oct 1, 2020

does this still work?

@Ahmed-Ababneh
Copy link

I love u <3 <3 u saved my life <3 its working

@rarahim75
Copy link

Thanks! I have given the source code just below the title.
Anyway: https://github.com/Maadhav/youtube-downloader-API

Great work man.. hopefully this remains working for a longer time.

@jazzy8
Copy link

jazzy8 commented Dec 15, 2020

I found an error when running on Repl.it:
[Tue Dec 15 22:14:00 2020] PHP Notice: Undefined index: url_encoded_fmt_stream_map in /home/runner/FreeYoutube/index.php on line 66 [Tue Dec 15 22:14:00 2020] PHP Notice: Undefined offset: 1 in /home/runner/FreeYoutube/index.php on line 102

@Maadhav
Copy link

Maadhav commented Dec 16, 2020

@jazzy8 Can u send the repl.it public URL for the project u are trying to run?

@bigboy-baby
Copy link

I created a Javascript variant for anyone not wanting to rely on calling an external API, https://gist.github.com/JMV2112/f131f6d7c7782eb6e54c72f4da735ec0

this doesnt work

@khari998
Copy link

This no longer works 😞

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment