[Golang] Parse Dash Manifest in Instagram Post Live Story


Get urls of video and audio of Instagram user post live videos that are shared to stories. We will parse dash manifest via Go standard regexp package.

Run Code on Go Playground

package main

import (
      "fmt"
      "regexp"
)

const testDashManifest = `<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" minBufferTime="PT1.500S" type="static" mediaPresentationDuration="PT0H0M9.468S" maxSegmentDuration="PT0H0M2.000S" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011,http://dashif.org/guidelines/dash264"><Period duration="PT0H0M9.468S"><AdaptationSet segmentAlignment="true" maxWidth="396" maxHeight="746" maxFrameRate="16000/528" par="396:746" lang="und" subsegmentAlignment="true" subsegmentStartsWithSAP="1"><Representation id="17924879014006631v" mimeType="video/mp4" codecs="avc1.4d401f" width="396" height="746" frameRate="16000/528" sar="1:1" startWithSAP="1" bandwidth="836675" FBQualityClass="sd" FBQualityLabel="396w"><BaseURL>https://instagram.fkhh1-1.fna.fbcdn.net/vp/4bc800aa48ed9f3bcc763d3e5d4e48fe/5A8F0D5A/t72.12950-16/27465973_336693050159819_3428588455850934272_n.mp4</BaseURL><SegmentBase indexRangeExact="true" indexRange="899-1026"><Initialization range="0-898"/></SegmentBase></Representation></AdaptationSet><AdaptationSet segmentAlignment="true" lang="und" subsegmentAlignment="true" subsegmentStartsWithSAP="1"><Representation id="17924879014006631a" mimeType="audio/mp4" codecs="mp4a.40.2" audioSamplingRate="44100" startWithSAP="1" bandwidth="51679"><AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/><BaseURL>https://instagram.fkhh1-1.fna.fbcdn.net/vp/c3198573a9e6375f6bd01da3c8312dc4/5A8F0753/t72.12950-16/27486167_191963884733826_1789728450089582592_n.mp4</BaseURL><SegmentBase indexRangeExact="true" indexRange="835-926"><Initialization range="0-834"/></SegmentBase></Representation></AdaptationSet></Period></MPD>`

func getBaseUrls(dm string) (urls []string, err error) {
      reBaseUrls, err := regexp.Compile(`<BaseURL>(.+?)<\/BaseURL>`)
      if err != nil {
              return
      }

      matches := reBaseUrls.FindAllStringSubmatch(dm, -1)
      for _, match := range matches {
              urls = append(urls, match[1])
      }
      return
}

func main() {
      urls, err := getBaseUrls(testDashManifest)
      if err != nil {
              panic(err)
      }

      for _, url := range urls {
              // 2 urls: one is video, and the other is audio
              fmt.Println(url)
      }
}

Tested on: Ubuntu 17.10 + Go 1.10 and Go Playground


References:

[1]Online regex tester and debugger: PHP, PCRE, Python, Golang and JavaScript
[2]
[3]
[4]get url of video and audio of post live · siongui/instago@eb122f5 · GitHub