Skip to content

Instantly share code, notes, and snippets.

@egyjs
Last active November 11, 2024 10:13
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!");
}
@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