1

I have php script which returns video streams as output. Output contains multiple unique streams.

I am trying to encode output into json but because of multiple foreach loop its not giving proper output

Code :

<?php

if (isset($_GET["id"]))
    $id = $_GET["id"];
$temp = explode("=",$id);
$link=end($temp);

parse_str(file_get_contents('http://www.youtube.com/get_video_info?video_id='.$link), $video_data);
$streams = $video_data['url_encoded_fmt_stream_map'];
$streams = explode(',',$streams);

$arr = array(); 

foreach ($streams as $streamdata) {
    parse_str($streamdata,$streamdata);
    foreach ($streamdata as $key => $value) {
        $myObj->$key = $value;
    }
    $arr = $myObj;
}

echo json_encode(array("streams"=>$arr));
?>

Above code will return only last stream/item from output.

Output :

{
   "streams":{
      "quality":"small",
      "type":"video\/3gpp; codecs=\"mp4v.20.3, mp4a.40.2\"",
      "itag":"17",
      "url":"video_link"
    }
}

If i put echo json_encode(array("streams"=>$arr)); inside upper foreach loop. It will return all streams with multiple root nodes, and its not acceptable. I need only one root node which contains all steams.

Output :

{
     "streams":{
      "type":"video\/mp4; codecs=\"avc1.64001F, mp4a.40.2\"",
      "itag":"22",
      "url":"video_link",
      "quality":"hd720"
    }
    }{
    "streams":{
      "type":"video\/webm; codecs=\"vp8.0, vorbis\"",
      "itag":"43",
      "url":"video_link",
      "quality":"medium"
    }
    }{
    "streams":{
      "type":"video\/mp4; codecs=\"avc1.42001E, mp4a.40.2\"",
      "itag":"18",
      "url":"video_link",
      "quality":"medium"
    }
    }{
    "streams":{
      "type":"video\/3gpp; codecs=\"mp4v.20.3, mp4a.40.2\"",
      "itag":"36",
      "url":"video_link",
      "quality":"small"
    }
    }{
    "streams":{
      "type":"video\/3gpp; codecs=\"mp4v.20.3, mp4a.40.2\"",
      "itag":"17",
      "url":"video_link",
      "quality":"small"
    }
}

Desired output will be :

{
  "streams":[
  {
     "quality":"hd720",
     "itag":"44",
     "url":"video_link",
     "type":"video\/3gpp; codecs=\"mp4v.20.3, mp4a.40.2\""
  },
  {
     "quality":"medium",
     "itag":"",
     "url":"video_link",
     "type":"video\/3gpp; codecs=\"mp4v.20.3, mp4a.40.2\""
  },
  {
     "quality":"medium",
     "itag":"17",
     "url":"video_link",
     "type":"video\/3gpp; codecs=\"mp4v.20.3, mp4a.40.2\""
  },
  {
     "quality":"medium",
     "itag":"17",
     "url":"video_link",
     "type":"video\/3gpp; codecs=\"mp4v.20.3, mp4a.40.2\""
  },
  {
     "quality":"small",
     "itag":"17",
     "url":"video_link",
     "type":"video\/3gpp; codecs=\"mp4v.20.3, mp4a.40.2\""
  },
  {
     "quality":"small",
     "itag":"17",
     "url":"video_link",
     "type":"video\/3gpp; codecs=\"mp4v.20.3, mp4a.40.2\""
  }

 ]
  }

Is there any way to combing multiple root nodes or get json output with all streams.

Note :

  • Outer foreach loop iterates 5 times in script lifetime
  • Inner foreach loop iterates 4 times per each outer foreach loop in script lifetime

Please help me with this as i am new to php. TIA !!!

2
  • 1
    Please give an example of your desired output. The output provided in answer contains invalid JSON data and it is not clear if you mentioned it as the desired output, or the output currently generated by your code (which you don't want) Commented Aug 20, 2017 at 17:30
  • Please provide an example of $video_data and desired output. Commented Aug 20, 2017 at 17:33

2 Answers 2

2

Tested this and got the output.

<?php
if (isset($_GET["id"]))
    $id = $_GET["id"];
$temp = explode("=",$id);
$link=end($temp);

parse_str(file_get_contents('http://www.youtube.com/get_video_info?video_id='.$link), $video_data);
$streams = $video_data['url_encoded_fmt_stream_map'];
$streams = explode(',',$streams);

$arr = array(); 

foreach ($streams as $streamdata) {
    parse_str($streamdata,$streamdata);
    $myObj = new stdClass();
    foreach ($streamdata as $key => $value) {
        $myObj->$key = $value;
    }
    array_push($arr, $myObj);
}


print_r (json_encode(array("streams"=>$arr)));
?>

output:

{
    "streams": [{
            "itag": "22",
            "url": "https:\/\/r5---sn-q4fl6nlz.googlevideo.com\/videoplayback?expire=1503278582&mm=31&mv=m&pl=14&mt=1503256900&ms=au&ei=luGZWY6yCc-I-wOk15GgAQ&signature=703194A7AAF91601C8B1A3D674CDEE89D9B7F7D4.489762A45FA4A3A72D00974427199FCFF1538CF9&source=youtube&beids=%5B9466594%5D&mn=sn-q4fl6nlz&requiressl=yes&mime=video%2Fmp4&ipbits=0&initcwndbps=997500&pcm2=yes&lmt=1502949906234234&dur=250.938&itag=22&ip=172.251.185.232&sparams=dur%2Cei%2Cid%2Cinitcwndbps%2Cip%2Cipbits%2Citag%2Clmt%2Cmime%2Cmm%2Cmn%2Cms%2Cmv%2Cpcm2%2Cpl%2Cratebypass%2Crequiressl%2Csource%2Cexpire&ratebypass=yes&id=o-AIo4CAPPPE9wPzwlmOhlF16F8YLqOYKrKwH0STEOsWbH&key=yt6",
            "type": "video\/mp4; codecs=\"avc1.64001F, mp4a.40.2\"",
            "quality": "hd720"
        }, {
            "itag": "43",
            "url": "https:\/\/r5---sn-q4fl6nlz.googlevideo.com\/videoplayback?expire=1503278582&mm=31&mv=m&pl=14&mt=1503256900&ms=au&ei=luGZWY6yCc-I-wOk15GgAQ&signature=4333D8109A90B3DC6844C6A6930A8558ECCC2A05.B736A90E09E2A47A4B3E1630CDD260099A15E17C&source=youtube&beids=%5B9466594%5D&mn=sn-q4fl6nlz&requiressl=yes&clen=25853304&ipbits=0&initcwndbps=997500&pcm2=yes&lmt=1502953964372465&dur=0.000&itag=43&mime=video%2Fwebm&ip=172.251.185.232&sparams=clen%2Cdur%2Cei%2Cgir%2Cid%2Cinitcwndbps%2Cip%2Cipbits%2Citag%2Clmt%2Cmime%2Cmm%2Cmn%2Cms%2Cmv%2Cpcm2%2Cpl%2Cratebypass%2Crequiressl%2Csource%2Cexpire&ratebypass=yes&id=o-AIo4CAPPPE9wPzwlmOhlF16F8YLqOYKrKwH0STEOsWbH&gir=yes&key=yt6",
            "type": "video\/webm; codecs=\"vp8.0, vorbis\"",
            "quality": "medium"
        }, {
            "itag": "18",
            "url": "https:\/\/r5---sn-q4fl6nlz.googlevideo.com\/videoplayback?expire=1503278582&mm=31&mv=m&pl=14&mt=1503256900&ms=au&ei=luGZWY6yCc-I-wOk15GgAQ&signature=2F70C59BD7F8F63DCEFA2935882935245A04C40B.E3D4DA76837E3DC74B795B17982796C11BCEBF53&source=youtube&beids=%5B9466594%5D&mn=sn-q4fl6nlz&requiressl=yes&clen=18940088&ipbits=0&initcwndbps=997500&pcm2=yes&lmt=1502949691460473&dur=250.938&itag=18&mime=video%2Fmp4&ip=172.251.185.232&sparams=clen%2Cdur%2Cei%2Cgir%2Cid%2Cinitcwndbps%2Cip%2Cipbits%2Citag%2Clmt%2Cmime%2Cmm%2Cmn%2Cms%2Cmv%2Cpcm2%2Cpl%2Cratebypass%2Crequiressl%2Csource%2Cexpire&ratebypass=yes&id=o-AIo4CAPPPE9wPzwlmOhlF16F8YLqOYKrKwH0STEOsWbH&gir=yes&key=yt6",
            "type": "video\/mp4; codecs=\"avc1.42001E, mp4a.40.2\"",
            "quality": "medium"
        }, {
            "itag": "36",
            "url": "https:\/\/r5---sn-q4fl6nlz.googlevideo.com\/videoplayback?expire=1503278582&mm=31&mv=m&pl=14&mt=1503256900&ms=au&ei=luGZWY6yCc-I-wOk15GgAQ&signature=914720619C03249F8A94B02CA36F95D2CD8A50E7.8C06516CEFD9667BEEA2950F63FEDBF701E85D69&source=youtube&beids=%5B9466594%5D&mn=sn-q4fl6nlz&requiressl=yes&clen=6819898&ipbits=0&initcwndbps=997500&pcm2=yes&lmt=1502949683841137&dur=250.961&itag=36&mime=video%2F3gpp&ip=172.251.185.232&sparams=clen%2Cdur%2Cei%2Cgir%2Cid%2Cinitcwndbps%2Cip%2Cipbits%2Citag%2Clmt%2Cmime%2Cmm%2Cmn%2Cms%2Cmv%2Cpcm2%2Cpl%2Crequiressl%2Csource%2Cexpire&id=o-AIo4CAPPPE9wPzwlmOhlF16F8YLqOYKrKwH0STEOsWbH&gir=yes&key=yt6",
            "type": "video\/3gpp; codecs=\"mp4v.20.3, mp4a.40.2\"",
            "quality": "small"
        }, {
            "itag": "17",
            "url": "https:\/\/r5---sn-q4fl6nlz.googlevideo.com\/videoplayback?expire=1503278582&mm=31&mv=m&pl=14&mt=1503256900&ms=au&ei=luGZWY6yCc-I-wOk15GgAQ&signature=A2741E73F8FF9500D84A3A2E69F84536F7168B38.BB6575A1C38784D6841F2D8788FDEE38D4F0DA2B&source=youtube&beids=%5B9466594%5D&mn=sn-q4fl6nlz&requiressl=yes&clen=2446985&ipbits=0&initcwndbps=997500&pcm2=yes&lmt=1502949684640176&dur=250.961&itag=17&mime=video%2F3gpp&ip=172.251.185.232&sparams=clen%2Cdur%2Cei%2Cgir%2Cid%2Cinitcwndbps%2Cip%2Cipbits%2Citag%2Clmt%2Cmime%2Cmm%2Cmn%2Cms%2Cmv%2Cpcm2%2Cpl%2Crequiressl%2Csource%2Cexpire&id=o-AIo4CAPPPE9wPzwlmOhlF16F8YLqOYKrKwH0STEOsWbH&gir=yes&key=yt6",
            "type": "video\/3gpp; codecs=\"mp4v.20.3, mp4a.40.2\"",
            "quality": "small"
        }]
}
Sign up to request clarification or add additional context in comments.

1 Comment

Thanks. Exactly what i wanted !!
0

This should give the desired output:

<?php

if (isset($_GET["id"]))
    $id = $_GET["id"];
$temp = explode("=",$id);
$link=end($temp);

parse_str(file_get_contents('http://www.youtube.com/get_video_info?video_id='.$link), $video_data);
$streams = $video_data['url_encoded_fmt_stream_map'];
$streams = explode(',',$streams);

$arr = array(); 

foreach ($streams as $streamdata) {
    parse_str($streamdata,$streamdata);
    foreach ($streamdata as $key => $value) {
        $arr[] = [$key => $streamdata[$key]]
    }
}

echo json_encode(array("streams"=>$arr));
?>

7 Comments

I think this solution would not produce the output requested in the description.
@Sebastian Thanks but it will only output values without keys
@SebastianCorneliuVîrlan Nope. Still getting only last stream as output
Now? I not sure about how you files looks like.
@SebastianCorneliuVîrlan Thanks,Output is correct now but not in the format which i have specified in my question. Please can you output json format as i specified. It will be very helpful
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.