You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Ramiro de Zavalia 274ec848c6 update the README file with some info 5 years ago
examples Add a few example playlists 5 years ago
.gitignore ignore binary 5 years ago
LICENSE Initial commit 5 years ago
README.md update the README file with some info 5 years ago
main.go Add a comment of why we need to fix index length 5 years ago

README.md

m3u82json

This tool let’s you encode a HLS m3u8 playlist into json. It support’s both master and playlist types. It could handle a URL and download the playlist or read from a file or standard input.

$ ./m3u82json -h
Usage of ./m3u82json:
  -a	make URI absolute
  -b string
    	Base URL
  -r	Recursive download master and playlists

Example output:

$ ./m3u82json 'https://mnmedias.api.telequebec.tv/m3u8/29880.m3u8'
{
 "URL": "https://mnmedias.api.telequebec.tv/m3u8/29880.m3u8",
 "BaseUrl": "https://mnmedias.api.telequebec.tv/m3u8",
 "Type": "master",
 "Manifest": {
  "Variants": [
   {
    "URI": "https://s2.content.video.llnw.net/smedia/42f4e71183054396907c0dea18241568/yd/yLpoUEilVrxhhYSkpsyGMnn9t0N3AYxWmoMsM7Faw/francstireurs_entrevue_ep472_seq24.mpegts/playlist-de5cb50573ac3952cd031f64973a614828771406.m3u8",
    "Chunklist": null,
    "ProgramId": 1,
    "Bandwidth": 794000,
    "AverageBandwidth": 0,
    "Codecs": "avc1.64001f,mp4a.40.2",
    "Resolution": "640x360",
    "Audio": "",
    "Video": "",
    "Subtitles": "",
    "Captions": "",
    "Name": "",
    "Iframe": false,
    "VideoRange": "",
    "HDCPLevel": "",
    "FrameRate": 0,
    "Alternatives": null
   },
   {
    "URI": "https://s2.content.video.llnw.net/smedia/42f4e71183054396907c0dea18241568/pG/_eYmKLIBSVI6S27rSuF_ykGSlW0Qc8D1PALJty4Mk/francstireurs_entrevue_ep472_seq24.mpegts/playlist-3e7933be6a617888b736c1ebbb1f2a6bcda30afd.m3u8",
    "Chunklist": null,
    "ProgramId": 1,
    "Bandwidth": 64000,
    "AverageBandwidth": 0,
    "Codecs": "",
    "Resolution": "398x224",
    "Audio": "",
...

Once you have a json, it is very easy to work with it, for example with jq:

Get the Resolution and bandwidth of each rendition:

$ ./m3u82json -r 'https://mnmedias.api.telequebec.tv/m3u8/29880.m3u8' | jq '.Manifest | .Variants[] | {Resolution: .Resolution, BW: .Bandwidth}'
{
  "Resolution": "640x360",
  "BW": 794000
}
{
  "Resolution": "398x224",
  "BW": 64000
}
{
  "Resolution": "416x234",
  "BW": 209000
}
{
  "Resolution": "480x270",
  "BW": 429000
}
{
  "Resolution": "768x432",
  "BW": 1196000
}
{
  "Resolution": "960x540",
  "BW": 2096000
}
{
  "Resolution": "1280x720",
  "BW": 3096000
}

Get the URL of each rendition:

$ ./m3u82json -r 'https://mnmedias.api.telequebec.tv/m3u8/29880.m3u8' | jq '.Manifest | .Variants[] | .URI'
"https://s2.content.video.llnw.net/smedia/42f4e71183054396907c0dea18241568/yd/yLpoUEilVrxhhYSkpsyGMnn9t0N3AYxWmoMsM7Faw/francstireurs_entrevue_ep472_seq24.mpegts/playlist-de5cb50573ac3952cd031f64973a614828771406.m3u8"
"https://s2.content.video.llnw.net/smedia/42f4e71183054396907c0dea18241568/pG/_eYmKLIBSVI6S27rSuF_ykGSlW0Qc8D1PALJty4Mk/francstireurs_entrevue_ep472_seq24.mpegts/playlist-3e7933be6a617888b736c1ebbb1f2a6bcda30afd.m3u8"
"https://s2.content.video.llnw.net/smedia/42f4e71183054396907c0dea18241568/Sf/0Yz6m4a9H2LvdJs5cXZ2OkLVBsVETi3pQR4LF-Z3k/francstireurs_entrevue_ep472_seq24.mpegts/playlist-767499b7586bfe9b892916f8a24e71928f2e509f.m3u8"
"https://s2.content.video.llnw.net/smedia/42f4e71183054396907c0dea18241568/DW/tAHYcWrGU7mj9nce4TbYlou5LPRT67U7UKqD1-L2c/francstireurs_entrevue_ep472_seq24.mpegts/playlist-b08bceed9acbde9e396ff9bda6c47b0e2767ffc3.m3u8"
"https://s2.content.video.llnw.net/smedia/42f4e71183054396907c0dea18241568/Eg/o_fUnlyL800wzDHxFl6hhw-8UQc-ooyDeghAFJJhc/francstireurs_entrevue_ep472_seq24.mpegts/playlist-d4a7a4f0ec6d5166035d24a010a67a11eca19cf4.m3u8"
"https://s2.content.video.llnw.net/smedia/42f4e71183054396907c0dea18241568/lB/Qc25Nb0TUdQe_w_ScrBJzqxkVpsKUEm1dGtLWhM3g/francstireurs_entrevue_ep472_seq24.mpegts/playlist-10a6530ae4e350c1c757c11287d1a0f7c2fad471.m3u8"
"https://s2.content.video.llnw.net/smedia/42f4e71183054396907c0dea18241568/Ks/l56Xl_JnkEU-hQoz9-AHS5lrBjICWHZV0dybQSN3w/francstireurs_entrevue_ep472_seq24.mpegts/playlist-933ef269e85350d026f5e55af66a76a52737ff48.m3u8"

Get the last chunk of the best rendition:

$ ./m3u82json -r -a 'https://mnmedias.api.telequebec.tv/m3u8/29880.m3u8' | jq '.Manifest | .Variants[] | select(.Resolution == "1280x720") | .Chunklist.Segments[-1]'
{
  "SeqId": 104,
  "Title": "",
  "URI": "https://mnmedias.api.telequebec.tv/m3u8/playlist104.ts",
  "Duration": 8.313322,
  "Limit": 0,
  "Offset": 0,
  "Key": null,
  "Map": null,
  "Discontinuity": false,
  "SCTE": null,
  "ProgramDateTime": "0001-01-01T00:00:00Z",
  "Custom": null
}