globocom / m3u8

Python m3u8 Parser for HTTP Live Streaming (HLS) Transmissions
Other
2.03k stars 471 forks source link

Sort playlist according to bandwidth #297

Closed vasudevavarun closed 1 year ago

vasudevavarun commented 2 years ago

Hi!

Is their any way in by which I can sort my m3u8 according to bandwidth?

EXTM3U

EXT-X-INDEPENDENT-SEGMENTS

EXT-X-MEDIA:TYPE=AUDIO,URI="eng.m3u8",GROUP-ID="default-audio-group",LANGUAGE="en",NAME="eng",AUTOSELECT=YES,CHANNELS="2"

EXT-X-STREAM-INF:BANDWIDTH=6707127,AVERAGE-BANDWIDTH=4113283,CODECS="avc1.4d4029,mp4a.40.2",RESOLUTION=1920x1080,FRAME-RATE=25.000,AUDIO="default-audio-group",CLOSED-CAPTIONS=NONE

4000000.m3u8

EXT-X-STREAM-INF:BANDWIDTH=615175,AVERAGE-BANDWIDTH=458716,CODECS="avc1.4d4015,mp4a.40.2",RESOLUTION=416x234,FRAME-RATE=25.000,AUDIO="default-audio-group",CLOSED-CAPTIONS=NONE

300000.m3u8

EXT-X-STREAM-INF:BANDWIDTH=458007,AVERAGE-BANDWIDTH=360905,CODECS="avc1.4d4014,mp4a.40.2",RESOLUTION=416x234,FRAME-RATE=25.000,AUDIO="default-audio-group",CLOSED-CAPTIONS=NONE

200000.m3u8

EXT-X-STREAM-INF:BANDWIDTH=2578647,AVERAGE-BANDWIDTH=1568642,CODECS="avc1.4d401f,mp4a.40.2",RESOLUTION=1024x576,FRAME-RATE=25.000,AUDIO="default-audio-group",CLOSED-CAPTIONS=NONE

1400000.m3u8

EXT-X-STREAM-INF:BANDWIDTH=3991279,AVERAGE-BANDWIDTH=2357309,CODECS="avc1.4d4020,mp4a.40.2",RESOLUTION=1280x720,FRAME-RATE=25.000,AUDIO="default-audio-group",CLOSED-CAPTIONS=NONE

2200000.m3u8

EXT-X-STREAM-INF:BANDWIDTH=1311903,AVERAGE-BANDWIDTH=863114,CODECS="avc1.4d401e,mp4a.40.2",RESOLUTION=640x360,FRAME-RATE=25.000,AUDIO="default-audio-group",CLOSED-CAPTIONS=NONE

700000.m3u8

mauricioabreu commented 2 years ago

Hello @vasudevavarun yes. You can load the playlist and then you have an object. You can rearrange the playlists and dump them again. Do you need some help to do this?

vasudevavarun commented 2 years ago

Hello @vasudevavarun yes. You can load the playlist and then you have an object. You can rearrange the playlists and dump them again. Do you need some help to do this?

Yes please, That would be really helpful.

bbayles commented 1 year ago

This will do what you want:

from m3u8 import loads
playlist_text = '...'  # Your text goes here
parsed_playlist = loads(playlist_text)
parsed_playlist.playlists.sort(key=lambda x: x.stream_info.average_bandwidth).
new_playlist_text = parsed_playlist.dumps()

This gets you:

#EXTM3U
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-MEDIA:URI="eng.m3u8",TYPE=AUDIO,GROUP-ID="default-audio-group",LANGUAGE="en",NAME="eng",AUTOSELECT=YES,CHANNELS="2"
#EXT-X-STREAM-INF:CLOSED-CAPTIONS=NONE,BANDWIDTH=458007,AVERAGE-BANDWIDTH=360905,RESOLUTION=416x234,FRAME-RATE=25,CODECS="avc1.4d4014,mp4a.40.2",AUDIO="default-audio-group"
200000.m3u8
#EXT-X-STREAM-INF:CLOSED-CAPTIONS=NONE,BANDWIDTH=615175,AVERAGE-BANDWIDTH=458716,RESOLUTION=416x234,FRAME-RATE=25,CODECS="avc1.4d4015,mp4a.40.2",AUDIO="default-audio-group"
300000.m3u8
#EXT-X-STREAM-INF:CLOSED-CAPTIONS=NONE,BANDWIDTH=1311903,AVERAGE-BANDWIDTH=863114,RESOLUTION=640x360,FRAME-RATE=25,CODECS="avc1.4d401e,mp4a.40.2",AUDIO="default-audio-group"
700000.m3u8
#EXT-X-STREAM-INF:CLOSED-CAPTIONS=NONE,BANDWIDTH=2578647,AVERAGE-BANDWIDTH=1568642,RESOLUTION=1024x576,FRAME-RATE=25,CODECS="avc1.4d401f,mp4a.40.2",AUDIO="default-audio-group"
1400000.m3u8
#EXT-X-STREAM-INF:CLOSED-CAPTIONS=NONE,BANDWIDTH=3991279,AVERAGE-BANDWIDTH=2357309,RESOLUTION=1280x720,FRAME-RATE=25,CODECS="avc1.4d4020,mp4a.40.2",AUDIO="default-audio-group"
2200000.m3u8
#EXT-X-STREAM-INF:CLOSED-CAPTIONS=NONE,BANDWIDTH=6707127,AVERAGE-BANDWIDTH=4113283,RESOLUTION=1920x1080,FRAME-RATE=25,CODECS="avc1.4d4029,mp4a.40.2",AUDIO="default-audio-group"
4000000.m3u8
vasudevavarun commented 1 year ago

This will do what you want:

from m3u8 import loads
playlist_text = '...'  # Your text goes here
parsed_playlist = loads(playlist_text)
parsed_playlist.playlists.sort(key=lambda x: x.stream_info.average_bandwidth).
new_playlist_text = parsed_playlist.dumps()

This gets you:

#EXTM3U
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-MEDIA:URI="eng.m3u8",TYPE=AUDIO,GROUP-ID="default-audio-group",LANGUAGE="en",NAME="eng",AUTOSELECT=YES,CHANNELS="2"
#EXT-X-STREAM-INF:CLOSED-CAPTIONS=NONE,BANDWIDTH=458007,AVERAGE-BANDWIDTH=360905,RESOLUTION=416x234,FRAME-RATE=25,CODECS="avc1.4d4014,mp4a.40.2",AUDIO="default-audio-group"
200000.m3u8
#EXT-X-STREAM-INF:CLOSED-CAPTIONS=NONE,BANDWIDTH=615175,AVERAGE-BANDWIDTH=458716,RESOLUTION=416x234,FRAME-RATE=25,CODECS="avc1.4d4015,mp4a.40.2",AUDIO="default-audio-group"
300000.m3u8
#EXT-X-STREAM-INF:CLOSED-CAPTIONS=NONE,BANDWIDTH=1311903,AVERAGE-BANDWIDTH=863114,RESOLUTION=640x360,FRAME-RATE=25,CODECS="avc1.4d401e,mp4a.40.2",AUDIO="default-audio-group"
700000.m3u8
#EXT-X-STREAM-INF:CLOSED-CAPTIONS=NONE,BANDWIDTH=2578647,AVERAGE-BANDWIDTH=1568642,RESOLUTION=1024x576,FRAME-RATE=25,CODECS="avc1.4d401f,mp4a.40.2",AUDIO="default-audio-group"
1400000.m3u8
#EXT-X-STREAM-INF:CLOSED-CAPTIONS=NONE,BANDWIDTH=3991279,AVERAGE-BANDWIDTH=2357309,RESOLUTION=1280x720,FRAME-RATE=25,CODECS="avc1.4d4020,mp4a.40.2",AUDIO="default-audio-group"
2200000.m3u8
#EXT-X-STREAM-INF:CLOSED-CAPTIONS=NONE,BANDWIDTH=6707127,AVERAGE-BANDWIDTH=4113283,RESOLUTION=1920x1080,FRAME-RATE=25,CODECS="avc1.4d4029,mp4a.40.2",AUDIO="default-audio-group"
4000000.m3u8

Hey, Thank you so much. It worked like a charm.

mauricioabreu commented 1 year ago

Thank you @bbayles