From 23c182b825e6373785aa201e644751c2b5d2f75d Mon Sep 17 00:00:00 2001 From: ninya9k Date: Sun, 16 May 2021 00:24:50 +0000 Subject: [PATCH] remove purecss in index.html, no line break between camera and broadcaster name, remove race condition in /chat causing http 500 --- website/concatenate.py | 3 +- website/routes.py | 13 ++-- website/templates/chat-iframe.html | 2 +- website/templates/index.html | 103 +++++++++++++++------------- website/templates/users-iframe.html | 2 +- website/viewership.py | 3 +- 6 files changed, 71 insertions(+), 55 deletions(-) diff --git a/website/concatenate.py b/website/concatenate.py index 0ee2874..e7f21d0 100644 --- a/website/concatenate.py +++ b/website/concatenate.py @@ -232,6 +232,7 @@ class ConcatenatedSegments: def _corrupt(self, n): # TODO: make this corrupt more reliably (maybe it has to follow a full segment?) + # Doesn't corrupt when directly after init.mp4 print('ConcatenatedSegments._corrupt') self.corrupt_hook() self.close() @@ -242,4 +243,4 @@ class ConcatenatedSegments: return b'' def close(self): - self._closed = True \ No newline at end of file + self._closed = True diff --git a/website/routes.py b/website/routes.py index 75bdf65..6118aab 100644 --- a/website/routes.py +++ b/website/routes.py @@ -12,6 +12,8 @@ import website.utils.stream as stream from website.constants import DIR_STATIC, DIR_STATIC_EXTERNAL, VIDEOJS_ENABLED_BY_DEFAULT, SEGMENT_INIT, CHAT_SCROLLBACK, BROADCASTER_COLOUR, BROADCASTER_TOKEN, SEGMENTS_DIR, VIEW_COUNTING_PERIOD, HLS_TIME, NOTES, N_NONE, MESSAGE_MAX_LENGTH from website.concatenate import ConcatenatedSegments, resolve_segment_offset +RE_WHITESPACE = re.compile(r'\s+') + viewers = viewership.viewers def new_token(): @@ -144,9 +146,10 @@ def chat_iframe(): viewership.made_request(token) include_user_list = bool(request.args.get('users', default=1, type=int)) - messages = (message for message in chat.messages if not message['hidden']) - messages = zip(messages, range(CHAT_SCROLLBACK)) # show at most CHAT_SCROLLBACK messages - messages = (message for message, _ in messages) + with viewership.lock: # required because another thread can change chat.messages while we're iterating through it + messages = (message for message in chat.messages if not message['hidden']) + messages = zip(messages, range(CHAT_SCROLLBACK)) # show at most CHAT_SCROLLBACK messages + messages = [message for message, _ in messages] return render_template('chat-iframe.html', token=token, messages=messages, @@ -156,7 +159,9 @@ def chat_iframe(): broadcaster=token == BROADCASTER_TOKEN, broadcaster_colour=BROADCASTER_COLOUR, debug=request.args.get('debug'), - len=len) + RE_WHITESPACE=RE_WHITESPACE, + len=len, + chr=chr) @current_app.route('/heartbeat') def heartbeat(): diff --git a/website/templates/chat-iframe.html b/website/templates/chat-iframe.html index f81e1f3..9686a05 100644 --- a/website/templates/chat-iframe.html +++ b/website/templates/chat-iframe.html @@ -100,7 +100,7 @@ {% if message['viewer']['broadcaster'] %} >🎥{{ message['viewer']['nickname'] or default_nickname(message['viewer']['token']) }}{% with tag = message['viewer']['nickname'] == None and not message['viewer']['broadcaster'] %}{% if tag %}{{ message['viewer']['tag'] }}{% endif %}{{ RE_WHITESPACE.sub(chr(160), message['viewer']['nickname'] or default_nickname(message['viewer']['token'])) }}{% with tag = message['viewer']['nickname'] == None and not message['viewer']['broadcaster'] %}{% if tag %}{{ message['viewer']['tag'] }}{% endif %}
{{ message['viewer']['tripcode']['string'] }}
- - {% if use_videojs %} @@ -13,6 +11,19 @@ {% endif %} + - -
- -
+ +
+
{% if use_videojs %} @@ -61,13 +71,13 @@ {% else %} -
-
+
-
- - + replaceFrameURL("stream-info-container", "{{ url_for('stream_info', token=token) }}", "stream-info", ""); + replaceFrameURL("chat-container", "{{ url_for('chat_iframe', token=token) }}", "chat", "chat"); + + const chat = document.getElementById("chat"); + const usersToggle = document.getElementById("users-toggle"); + usersToggle.onchange = function() { + const chatMessages = chat.contentDocument.getElementById("messages"); + const chatUsers = chat.contentDocument.getElementById("users"); + if ( chatUsers == null || chatMessages == null ) + return; + /* using display: none; resets css animations, i.e. the manual refresh banner */ + if ( usersToggle.checked ) { + chatMessages.style.overflow = "hidden"; + chatMessages.style.height = "0"; + chatUsers.style.height = "unset"; + chatUsers.style.overflow = "unset"; + chat.style.transform = "revert"; + } else { + chatUsers.style.overflow = "hidden"; + chatUsers.style.height = "0"; + chatMessages.style.height = "unset"; + chatMessages.style.overflow = "unset"; + chat.style.transform = null; + } + } + chat.addEventListener("load", usersToggle.onchange); + + diff --git a/website/templates/users-iframe.html b/website/templates/users-iframe.html index 1fe0d40..08e592b 100644 --- a/website/templates/users-iframe.html +++ b/website/templates/users-iframe.html @@ -60,7 +60,7 @@
Broadcaster
- 🎥{{ person['nickname'] or default_nickname(person['token']) }}{% if person['tripcode']['string'] %}
{{ person['tripcode']['string'] }}
{% endif %} + 🎥{{ person['nickname'] or default_nickname(person['token']) }}{% if person['tripcode']['string'] %}
{{ person['tripcode']['string'] }}
{% endif %}
{% endif %} diff --git a/website/viewership.py b/website/viewership.py index f7397bd..91ffb76 100644 --- a/website/viewership.py +++ b/website/viewership.py @@ -6,7 +6,7 @@ import website.utils.colour as colour import website.utils.tripcode as tripcode from website.constants import ANON_DEFAULT_NICKNAME, BROADCASTER_COLOUR, BROADCASTER_TOKEN, HLS_TIME, HOST_DEFAULT_NICKNAME, SEGMENTS_DIR, VIEW_COUNTING_PERIOD -viewers = {} +viewers = {} # TODO: remove viewers who haven't visited for a while, or limit the size of this dictionary somehow; otherwise this dictionary can become arbitrarily large segment_views = {} video_was_corrupted = set() lock = threading.Lock() @@ -57,6 +57,7 @@ def made_request(token): def view_segment(n, token=None, check_exists=True): # n is None if segment_hook is called in ConcatenatedSegments and the current segment is init.mp4 if n == None: + print(f'init.mp4: {token}') return # technically this is a race condition