Skip to content

Instantly share code, notes, and snippets.

@w495
Created October 22, 2018 22:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save w495/4ac4695ea86b0e2902bd01e5573f42ef to your computer and use it in GitHub Desktop.
Save w495/4ac4695ea86b0e2902bd01e5573f42ef to your computer and use it in GitHub Desktop.
Micro chunk HLS checker
# -*- coding: utf8 -*-
from __future__ import absolute_import, division, print_function
import logging
import sys
import requests
MIN_CHUNK_SIZE = 1.0
logging.basicConfig(
level=logging.DEBUG,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
def main():
fname = sys.argv[1]
list_file = open(fname)
for raw_line in list_file:
line = raw_line[:-1]
line_list = line.split('\t')
logging.info("line_list = %s", line_list)
check_bad_pl(
*line_list
)
def check_bad_pl(uuid, url):
"""
:param str uuid:
:param str url:
:return:
"""
chunk_pl_list = parse_master_pl(url)
for chunk_pl in chunk_pl_list:
is_bad_chunk = parse_chunk_pl(chunk_pl)
if is_bad_chunk:
logging.error("bad = %s, %s", uuid, url)
print('bad = ', uuid, url)
return True
return False
def parse_master_pl(url):
"""
:param str url:
:return:
"""
url = url.strip()
response = requests.get(url)
content = response.content
content_list = content.split('\n')
url_parts = url.split('/')
url_base = '/'.join(url_parts[:-1])
for content_item in content_list:
if 'm3u8' in content_item:
chunk_pl = '{}/{}'.format(url_base, content_item)
yield chunk_pl
def parse_chunk_pl(url):
"""
:param str url:
:return:
"""
url = url.strip()
response = requests.get(url)
content = response.content
content_list = content.split('\n')
content_seq = filter_extinf(content_list)
content_list = list(content_seq)
for content_item in content_list[:-1]:
content_item = content_item.replace('#EXTINF:', '')
content_item = content_item.replace(',', '')
chunk_size = float(content_item)
if chunk_size < MIN_CHUNK_SIZE:
return True
return False
def filter_extinf(content_list):
"""
:param list[str] content_list:
:return:
"""
for content_item in content_list:
if '#EXTINF:' in content_item:
yield content_item
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment