From fcd71d0fcec100afa01f3c0579e1ff399ffd9b08 Mon Sep 17 00:00:00 2001 From: Jakob Cornell Date: Wed, 7 Oct 2020 10:37:00 -0500 Subject: [PATCH] Remove delay after master fetch, handle connection resets --- hls_watch/__main__.py | 53 ++++++++++++++++++++++++++----------------- 1 file changed, 32 insertions(+), 21 deletions(-) diff --git a/hls_watch/__main__.py b/hls_watch/__main__.py index 638eea9..2567747 100644 --- a/hls_watch/__main__.py +++ b/hls_watch/__main__.py @@ -7,6 +7,8 @@ from hls_watch.playlist import parse_master, parse_media _DELAY = datetime.timedelta(seconds = 10) +IGNORE_EXCEPTIONS = {ConnectionResetError} + def _get_time(resp): time_str = resp.info().get('Date') @@ -88,29 +90,38 @@ if __name__ == '__main__': or stream_spec.variant is None and not handler.in_sess ) if locate_stream: - with opener.open(master_url) as resp: - if resp.status == 200: - lines = resp.read().decode('utf-8').splitlines() - streams = parse_master(lines) - if streams: - winner = max(streams, key = lambda s: s.attrs['RESOLUTION'].vertical) - (ep, curr_variant) = re.match(r'(.*)_(.*?)\.m3u8$', winner.uri).groups() - assert ep == stream_spec.endpoint - else: - assert resp.status == 404 - time.sleep(_DELAY.total_seconds()) + try: + resp = opener.open(master_url) + except tuple(IGNORE_EXCEPTIONS): + pass + else: + with resp: + if resp.status == 200: + lines = resp.read().decode('utf-8').splitlines() + streams = parse_master(lines) + if streams: + winner = max(streams, key = lambda s: s.attrs['RESOLUTION'].vertical) + (ep, curr_variant) = re.match(r'(.*)_(.*?)\.m3u8$', winner.uri).groups() + assert ep == stream_spec.endpoint + else: + assert resp.status == 404 if curr_variant is not None: writer.stream = stream_spec._replace(variant = curr_variant) media_url = url_for_stream('{}.m3u8'.format(writer.stream.full())) - with opener.open(media_url) as resp: - if resp.status == 404: - handler.on_404() - else: - assert resp.status == 200 - lines = resp.read().decode('utf-8').splitlines() - handler.update(Capture( - time = _get_time(resp), - playlist = parse_media(lines), - )) + try: + resp = opener.open(media_url) + except tuple(IGNORE_EXCEPTIONS): + pass + else: + with resp: + if resp.status == 404: + handler.on_404() + else: + assert resp.status == 200 + lines = resp.read().decode('utf-8').splitlines() + handler.update(Capture( + time = _get_time(resp), + playlist = parse_media(lines), + )) time.sleep(_DELAY.total_seconds()) -- 2.30.2