Skip to content

Instantly share code, notes, and snippets.

@egyjs
Last active April 7, 2026 15:43
Show Gist options
  • Select an option

  • Save egyjs/9e60f1ae3168c38cc0f0054c15cd6a83 to your computer and use it in GitHub Desktop.

Select an option

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!");
}
@lhuxman-lhux

Copy link
Copy Markdown

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'].'
';
}

@heather-loll

Copy link
Copy Markdown

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.

@lhuxman-lhux

Copy link
Copy Markdown

@egyjs

egyjs commented Jan 28, 2020

Copy link
Copy Markdown
Author

@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
Copy Markdown

oke, no problem

@egyjs

egyjs commented Jan 28, 2020

Copy link
Copy Markdown
Author

no audio i any video @lhuxman-lhux

@lhuxman-lhux

Copy link
Copy Markdown

first url,

@egyjs

egyjs commented Jan 28, 2020

Copy link
Copy Markdown
Author

first url,

i did not understand this

@heather-loll

Copy link
Copy Markdown

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
Copy Markdown

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

Maadhav commented May 15, 2020

Copy link
Copy Markdown

@heather-loll

Copy link
Copy Markdown

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

Maadhav commented May 16, 2020

Copy link
Copy Markdown

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...

@heather-loll

heather-loll commented May 16, 2020

Copy link
Copy Markdown

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

Maadhav commented May 16, 2020

Copy link
Copy Markdown

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

@heather-loll

Copy link
Copy Markdown

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
Copy Markdown

@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

yosun commented Oct 1, 2020

Copy link
Copy Markdown

does this still work?

@Ahmed-Ababneh

Copy link
Copy Markdown

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

@rarahim75

Copy link
Copy Markdown

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

jazzy8 commented Dec 15, 2020

Copy link
Copy Markdown

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

Maadhav commented Dec 16, 2020

Copy link
Copy Markdown

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

@bigboy-baby

Copy link
Copy Markdown

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
Copy Markdown

This no longer works ๐Ÿ˜ž

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