From d55438afad40490417b9302304f6a308d2ff5f8f Mon Sep 17 00:00:00 2001
From: Aevann1 <59999695+Aevann1@users.noreply.github.com>
Date: Thu, 22 Sep 2022 04:17:02 +0200
Subject: [PATCH 01/17] Live (#364)
* test on devrama
* fix prev commit
* fix prev commit
* try some shit
* try some shit
* try some shit
* fix
* make it easier to change notif colors with custom css
* de
* t
* fgddfg
* fds
* fix
* fds
* dfs
* pain
* sdfsdf
* df
* xcv
* fd
* vxc
* xcv
* c
* fgdfgd
* sdf
* fsd
* fds
* sfd
* fdsf
* fd
* fds
* fds
* fsd
* fds
* fds
* fds
* fds
* fsd
* fds
* df
* fds
* dfs
* fd
* fsd
* fsd
* dfs
* sdf
* fsd
* fsd
* df
* dfs
* fd
* fsd
* dfs
* sdf
* sdf
* sdf
* fsd
* fds
* sfd
* sdf
* fds
* dfs
* df
* sdf
* sdf
* /live
---
files/routes/static.py | 57 ++++++++++++++++++++++++++++++++++++++-
files/templates/live.html | 44 ++++++++++++++++++++++++++++++
2 files changed, 100 insertions(+), 1 deletion(-)
create mode 100644 files/templates/live.html
diff --git a/files/routes/static.py b/files/routes/static.py
index 6f79af7aa..651548383 100644
--- a/files/routes/static.py
+++ b/files/routes/static.py
@@ -433,4 +433,59 @@ if not os.path.exists(f'files/templates/donate_{SITE_NAME}.html'):
@app.get('/donate')
@auth_required
def donate(v):
- return render_template(f'donate_{SITE_NAME}.html', v=v)
\ No newline at end of file
+ return render_template(f'donate_{SITE_NAME}.html', v=v)
+
+
+if SITE_NAME == 'PCM':
+ streamers = (
+ 'UCJrqlqe8DBZsfdMu7gGrVRA',
+ 'UCDDrY00FPYwLp9VqRhWiDgg',
+ 'UCdBzv8yzRgvnxV1M95qOsNA',
+ 'UCvRP7CKUHWTJamANqg8NCTQ',
+ 'UCPtDuLhreIEcjJr7WWaNaUw',
+ 'UCS8gM5S889oBPyN6K07ZC6A',
+ 'UCUn24NHjc8asGiYet1P9h5Q',
+ 'UCqdJpVkTPem_iKcoVqoZtAg',
+ 'UCtcVe3ucfS-AZVcNc2GabPw',
+ 'UCDk0PdOMRfknGhVE8R-S_DQ',
+ 'UC0UFeYG5aSGZT2e8lOjQ7oA',
+ 'UC1yC2i8t5ivhh5RsRpGWMlw',
+ 'UCP_YnD-BO8ctnKgUW89Si6Q',
+ 'UCoxFxZirbfLvy9tres71eSA',
+ 'UClf1Wfw54YBjJNlX3NjSOPA',
+ 'UC8X10knH1xD3PTeds8glyNw',
+ 'UCgKTJAN-IrVyX-jIJ5INEhA',
+ 'UCgjAbjJZgBCF3OVGkJV5kCw',
+ 'UC7xWZT4HPMFYzFoijmH8POg',
+ 'UCoBfUpZXvWjS995ZXCPxxVQ',
+ 'UCoOh1fOZBN7uCc3qu-TTAJQ',
+ 'UCo8wWQvRSoKL57vjv4vyXQw'
+ )
+
+ live_regex = re.compile('playerOverlayVideoDetailsRenderer":\{"title":\{"simpleText":"(.*?)"\},"subtitle":\{"runs":\[\{"text":"(.*?)"\},\{"text":" • "\},\{"text":"(.*?)"\}', flags=re.A)
+ live_thumb_regex = re.compile('\{"thumbnail":\{"thumbnails":\[\{"url":"(.*?)"', flags=re.A)
+ offline_regex = re.compile('","title":"(.*?)".*?"width":48,"height":48\},\{"url":"(.*?)"', flags=re.A)
+
+ @app.get('/live')
+ @app.get('/logged_out/live')
+ @auth_desired_with_logingate
+ def live(v):
+ live = []
+ offline = []
+ for x in streamers:
+ url = f'https://www.youtube.com/channel/{x}/live'
+ req = requests.get(url, cookies={'CONSENT': 'YES+1'}, proxies=proxies)
+ txt = req.text
+ if '"videoDetails":{"videoId"' in txt:
+ t = live_thumb_regex.search(txt)
+ y = live_regex.search(txt)
+ try:
+ count = int(y.group(3))
+ live.append((req.url, t.group(1), y.group(2), y.group(1), count))
+ except:
+ offline.append((req.url, t.group(1), y.group(2)))
+ else:
+ y = offline_regex.search(txt)
+ offline.append((req.url, y.group(2), y.group(1)))
+
+ return render_template(f'live.html', v=v, live=live, offline=offline)
\ No newline at end of file
diff --git a/files/templates/live.html b/files/templates/live.html
new file mode 100644
index 000000000..025afcc76
--- /dev/null
+++ b/files/templates/live.html
@@ -0,0 +1,44 @@
+{% extends "default.html" %}
+
+{% block title %}
+
{{SITE_NAME}} - Live
+{% endblock %}
+
+{% block content %}
+
+ Live
+
+
+
+ {% for link, thumb, name, title, viewers in live %}
+
+ |
+ {{name}} |
+ {{title}} |
+ {{viewers}} |
+
+ {% endfor %}
+
+
+
+
+ Offline
+
+
+
+ {% for link, thumb, name in offline %}
+
+ |
+ {{name}} |
+ |
+ |
+
+ {% endfor %}
+
+
+
+{% endblock %}
\ No newline at end of file
From c20fc347047e29c2820466f61c3312e776127512 Mon Sep 17 00:00:00 2001
From: Aevann1
Date: Thu, 22 Sep 2022 04:20:47 +0200
Subject: [PATCH 02/17] dfs
---
files/routes/static.py | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/files/routes/static.py b/files/routes/static.py
index 651548383..b1ef00c2c 100644
--- a/files/routes/static.py
+++ b/files/routes/static.py
@@ -486,6 +486,7 @@ if SITE_NAME == 'PCM':
offline.append((req.url, t.group(1), y.group(2)))
else:
y = offline_regex.search(txt)
- offline.append((req.url, y.group(2), y.group(1)))
+ try: offline.append((req.url, y.group(2), y.group(1)))
+ except: print(x)
return render_template(f'live.html', v=v, live=live, offline=offline)
\ No newline at end of file
From 71309f86fb1cffb09d3a8a64606675a1bdf060d7 Mon Sep 17 00:00:00 2001
From: Aevann1
Date: Thu, 22 Sep 2022 04:22:21 +0200
Subject: [PATCH 03/17] order by viewer count
---
files/routes/static.py | 1 +
1 file changed, 1 insertion(+)
diff --git a/files/routes/static.py b/files/routes/static.py
index b1ef00c2c..5db41b7ba 100644
--- a/files/routes/static.py
+++ b/files/routes/static.py
@@ -489,4 +489,5 @@ if SITE_NAME == 'PCM':
try: offline.append((req.url, y.group(2), y.group(1)))
except: print(x)
+ live = sorted(live, key=lambda x: x[4], reverse=True)
return render_template(f'live.html', v=v, live=live, offline=offline)
\ No newline at end of file
From 61f4ae873146480969a3e272bd5963fae03c3103 Mon Sep 17 00:00:00 2001
From: Aevann1
Date: Thu, 22 Sep 2022 04:25:03 +0200
Subject: [PATCH 04/17] add a red circle to /live
---
files/templates/live.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/files/templates/live.html b/files/templates/live.html
index 025afcc76..d5e2f65ca 100644
--- a/files/templates/live.html
+++ b/files/templates/live.html
@@ -10,7 +10,7 @@
border: 2.5px solid var(--primary);
}
- Live
+ Live
From 1dfbad69b8b28468a54cfaec4e70f15077de1c17 Mon Sep 17 00:00:00 2001
From: Aevann1
Date: Thu, 22 Sep 2022 04:27:41 +0200
Subject: [PATCH 05/17] cosmetic changes
---
files/templates/live.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/files/templates/live.html b/files/templates/live.html
index d5e2f65ca..f2ceb13a7 100644
--- a/files/templates/live.html
+++ b/files/templates/live.html
@@ -10,7 +10,7 @@
border: 2.5px solid var(--primary);
}
- Live
+ Live
From ddcebd10bea51fd3ebd0fa2f2a219f9d9fef88f4 Mon Sep 17 00:00:00 2001
From: Aevann1
Date: Thu, 22 Sep 2022 04:29:09 +0200
Subject: [PATCH 06/17] cosmetic changes
---
files/templates/live.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/files/templates/live.html b/files/templates/live.html
index f2ceb13a7..8baacd9a9 100644
--- a/files/templates/live.html
+++ b/files/templates/live.html
@@ -26,7 +26,7 @@
- Offline
+ Offline
From 59f7a7655bd1170b152840a215936b876fc9f043 Mon Sep 17 00:00:00 2001
From: Aevann1
Date: Thu, 22 Sep 2022 04:29:50 +0200
Subject: [PATCH 07/17] remove ordering as a test
---
files/routes/static.py | 1 -
1 file changed, 1 deletion(-)
diff --git a/files/routes/static.py b/files/routes/static.py
index 5db41b7ba..b1ef00c2c 100644
--- a/files/routes/static.py
+++ b/files/routes/static.py
@@ -489,5 +489,4 @@ if SITE_NAME == 'PCM':
try: offline.append((req.url, y.group(2), y.group(1)))
except: print(x)
- live = sorted(live, key=lambda x: x[4], reverse=True)
return render_template(f'live.html', v=v, live=live, offline=offline)
\ No newline at end of file
From 553218aaa5a9f3df8968b79c55b3e2df5a52849e Mon Sep 17 00:00:00 2001
From: Aevann1
Date: Thu, 22 Sep 2022 04:33:45 +0200
Subject: [PATCH 08/17] make /live a cached cron job
---
files/helpers/cron.py | 2 ++
files/routes/static.py | 16 +++++++++++-----
2 files changed, 13 insertions(+), 5 deletions(-)
diff --git a/files/helpers/cron.py b/files/helpers/cron.py
index 5b22796ea..c5393f5d2 100644
--- a/files/helpers/cron.py
+++ b/files/helpers/cron.py
@@ -39,6 +39,8 @@ def cron(every_5m, every_1h, every_1d, every_1mo):
stats.generate_charts_task(SITE)
route_static.stats_cached()
sub_inactive_purge_task()
+ if SITE_NAME == 'PCM':
+ route_static.live_cached()
if every_1mo:
if KOFI_LINK: give_monthly_marseybux_task_kofi()
diff --git a/files/routes/static.py b/files/routes/static.py
index b1ef00c2c..54dfb0c03 100644
--- a/files/routes/static.py
+++ b/files/routes/static.py
@@ -466,10 +466,8 @@ if SITE_NAME == 'PCM':
live_thumb_regex = re.compile('\{"thumbnail":\{"thumbnails":\[\{"url":"(.*?)"', flags=re.A)
offline_regex = re.compile('","title":"(.*?)".*?"width":48,"height":48\},\{"url":"(.*?)"', flags=re.A)
- @app.get('/live')
- @app.get('/logged_out/live')
- @auth_desired_with_logingate
- def live(v):
+ @cache.memoize(timeout=86400)
+ def live_cached():
live = []
offline = []
for x in streamers:
@@ -489,4 +487,12 @@ if SITE_NAME == 'PCM':
try: offline.append((req.url, y.group(2), y.group(1)))
except: print(x)
- return render_template(f'live.html', v=v, live=live, offline=offline)
\ No newline at end of file
+ live = sorted(live, key=lambda x: x[4], reverse=True)
+
+ return live, offline
+
+ @app.get('/live')
+ @app.get('/logged_out/live')
+ @auth_desired_with_logingate
+ def live(v):
+ return render_template(f'live.html', v=v, live=live_cached()[0], offline=live_cached()[1])
\ No newline at end of file
From b85c1940edb39902064f932fc60630df303b461b Mon Sep 17 00:00:00 2001
From: Aevann1
Date: Thu, 22 Sep 2022 04:46:44 +0200
Subject: [PATCH 09/17] [pcm] cosmetic change
---
files/templates/live.html | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/files/templates/live.html b/files/templates/live.html
index 8baacd9a9..8af3e5801 100644
--- a/files/templates/live.html
+++ b/files/templates/live.html
@@ -16,10 +16,12 @@
{% for link, thumb, name, title, viewers in live %}
- |
- {{name}} |
- {{title}} |
- {{viewers}} |
+
+ |
+ {{name}} |
+ {{title}} |
+ {{viewers}} |
+
{% endfor %}
From 0be4167069c25e667b97d6d58873de3ed0dba69f Mon Sep 17 00:00:00 2001
From: Aevann1
Date: Thu, 22 Sep 2022 04:47:28 +0200
Subject: [PATCH 10/17] revert last commit
---
files/templates/live.html | 10 ++++------
1 file changed, 4 insertions(+), 6 deletions(-)
diff --git a/files/templates/live.html b/files/templates/live.html
index 8af3e5801..8baacd9a9 100644
--- a/files/templates/live.html
+++ b/files/templates/live.html
@@ -16,12 +16,10 @@
{% for link, thumb, name, title, viewers in live %}
-
- |
- {{name}} |
- {{title}} |
- {{viewers}} |
-
+ |
+ {{name}} |
+ {{title}} |
+ {{viewers}} |
{% endfor %}
From 227810dec95372efa68c1ae41d5663bfb0c87956 Mon Sep 17 00:00:00 2001
From: Aevann1
Date: Thu, 22 Sep 2022 06:34:16 +0200
Subject: [PATCH 11/17] add /live icon
---
files/assets/css/main.css | 17 ++++++++++-------
files/templates/header.html | 12 +++++++++++-
files/templates/util/assetcache.html | 2 +-
3 files changed, 22 insertions(+), 9 deletions(-)
diff --git a/files/assets/css/main.css b/files/assets/css/main.css
index 6be4b3756..767600d1d 100644
--- a/files/assets/css/main.css
+++ b/files/assets/css/main.css
@@ -3148,13 +3148,6 @@ small, .small {
-webkit-animation: bounce-bot .7s 1 0s;
}
-@keyframes upmarsey
-{
- 0% { top: -15px; }
- 100% { top: 0px; }
-}
-
-
@keyframes bounce-top {
20% {
transform: translateY(-9px);
@@ -6270,4 +6263,14 @@ div.markdown {
.text-brown {
color: #433722;
+}
+
+.live-circle {
+ animation: blinker 1s infinite;
+}
+
+@keyframes blinker {
+ from { color: var(--gray-200) }
+ 50% { color:red }
+ to { color: var(--gray-200) }
}
\ No newline at end of file
diff --git a/files/templates/header.html b/files/templates/header.html
index 225c9eedd..2d5fbfd44 100644
--- a/files/templates/header.html
+++ b/files/templates/header.html
@@ -100,6 +100,10 @@
{% if g.webview %}
{% endif %}
+
+ {% if SITE_NAME == 'PCM' %}
+
+ {% endif %}
{% if v %}
{% if v.notifications_count %}
@@ -137,6 +141,12 @@
+ {% if SITE_NAME == 'PCM' %}
+ -
+
+
+ {% endif %}
+
{% if v %}
{% if v.notifications_count %}
@@ -151,7 +161,7 @@
{% if v.admin_level > 1 %}
-
-
+
{% endif %}
diff --git a/files/templates/util/assetcache.html b/files/templates/util/assetcache.html
index 9c1af4a69..3f56f1b21 100644
--- a/files/templates/util/assetcache.html
+++ b/files/templates/util/assetcache.html
@@ -1,6 +1,6 @@
{%-
set CACHE_VER = {
- 'css/main.css': 4033,
+ 'css/main.css': 4034,
'css/catalog.css': 4007,
'css/4chan.css': 4007,
'css/classic.css': 4031,
From 77fa9de79ae2f1d1554d648e2c79cb1d0d1b7476 Mon Sep 17 00:00:00 2001
From: Aevann1
Date: Thu, 22 Sep 2022 07:02:10 +0200
Subject: [PATCH 12/17] fix cronjob
---
files/helpers/cron.py | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/files/helpers/cron.py b/files/helpers/cron.py
index c5393f5d2..e8c18212e 100644
--- a/files/helpers/cron.py
+++ b/files/helpers/cron.py
@@ -29,8 +29,9 @@ def cron(every_5m, every_1h, every_1d, every_1mo):
if every_5m:
lottery.check_if_end_lottery_task()
spin_roulette_wheel()
- g.db.commit()
offsitementions.offsite_mentions_task()
+ if SITE_NAME == 'PCM':
+ route_static.live_cached()
if every_1h:
awards.award_timers_bots_task()
@@ -39,8 +40,6 @@ def cron(every_5m, every_1h, every_1d, every_1mo):
stats.generate_charts_task(SITE)
route_static.stats_cached()
sub_inactive_purge_task()
- if SITE_NAME == 'PCM':
- route_static.live_cached()
if every_1mo:
if KOFI_LINK: give_monthly_marseybux_task_kofi()
From 92204243242fd98563d5fec1859dadedeeed0292 Mon Sep 17 00:00:00 2001
From: Aevann1
Date: Thu, 22 Sep 2022 07:08:58 +0200
Subject: [PATCH 13/17] fix cron
---
files/helpers/cron.py | 2 ++
1 file changed, 2 insertions(+)
diff --git a/files/helpers/cron.py b/files/helpers/cron.py
index e8c18212e..fd66ebe74 100644
--- a/files/helpers/cron.py
+++ b/files/helpers/cron.py
@@ -6,6 +6,7 @@ from files.helpers.roulette import spin_roulette_wheel
from files.helpers.get import *
from files.helpers.actions import *
from files.classes import *
+from files.__main__ import cache
import files.helpers.lottery as lottery
import files.helpers.offsitementions as offsitementions
@@ -31,6 +32,7 @@ def cron(every_5m, every_1h, every_1d, every_1mo):
spin_roulette_wheel()
offsitementions.offsite_mentions_task()
if SITE_NAME == 'PCM':
+ cache.delete_memoized(route_static.live_cached())
route_static.live_cached()
if every_1h:
From c02e1bd76f6d6fce6cfe0a49a551ed1accd6419d Mon Sep 17 00:00:00 2001
From: Aevann1
Date: Thu, 22 Sep 2022 07:11:50 +0200
Subject: [PATCH 14/17] fix cron
---
files/helpers/cron.py | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/files/helpers/cron.py b/files/helpers/cron.py
index fd66ebe74..e4bde8b1c 100644
--- a/files/helpers/cron.py
+++ b/files/helpers/cron.py
@@ -12,7 +12,8 @@ import files.helpers.lottery as lottery
import files.helpers.offsitementions as offsitementions
import files.helpers.stats as stats
import files.helpers.awards as awards
-import files.routes.static as route_static
+
+from files.routes.static import stats_cached, live_cached
from sys import stdout
import datetime
@@ -32,8 +33,8 @@ def cron(every_5m, every_1h, every_1d, every_1mo):
spin_roulette_wheel()
offsitementions.offsite_mentions_task()
if SITE_NAME == 'PCM':
- cache.delete_memoized(route_static.live_cached())
- route_static.live_cached()
+ cache.delete_memoized(live_cached())
+ live_cached()
if every_1h:
awards.award_timers_bots_task()
From 40485e9ab66402e102f358b6ba2e6d2df2865757 Mon Sep 17 00:00:00 2001
From: Aevann1
Date: Thu, 22 Sep 2022 07:15:55 +0200
Subject: [PATCH 15/17] fix cron (im stoopid)
---
files/helpers/cron.py | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/files/helpers/cron.py b/files/helpers/cron.py
index e4bde8b1c..9529cf354 100644
--- a/files/helpers/cron.py
+++ b/files/helpers/cron.py
@@ -12,8 +12,7 @@ import files.helpers.lottery as lottery
import files.helpers.offsitementions as offsitementions
import files.helpers.stats as stats
import files.helpers.awards as awards
-
-from files.routes.static import stats_cached, live_cached
+import files.routes.static as route_static
from sys import stdout
import datetime
@@ -33,8 +32,8 @@ def cron(every_5m, every_1h, every_1d, every_1mo):
spin_roulette_wheel()
offsitementions.offsite_mentions_task()
if SITE_NAME == 'PCM':
- cache.delete_memoized(live_cached())
- live_cached()
+ cache.delete_memoized(route_static.live_cached)
+ route_static.live_cached()
if every_1h:
awards.award_timers_bots_task()
From 55ca68e6fb193d5bff40e0621b051a995403fb6a Mon Sep 17 00:00:00 2001
From: Aevann1
Date: Thu, 22 Sep 2022 07:17:16 +0200
Subject: [PATCH 16/17] same as last commit
---
files/helpers/cron.py | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/files/helpers/cron.py b/files/helpers/cron.py
index 9529cf354..16a6b8fad 100644
--- a/files/helpers/cron.py
+++ b/files/helpers/cron.py
@@ -40,8 +40,9 @@ def cron(every_5m, every_1h, every_1d, every_1mo):
if every_1d:
stats.generate_charts_task(SITE)
- route_static.stats_cached()
sub_inactive_purge_task()
+ cache.delete_memoized(route_static.stats_cached)
+ route_static.stats_cached()
if every_1mo:
if KOFI_LINK: give_monthly_marseybux_task_kofi()
From 70d7a4db31fa3907d86e7799eb63c164dc0c105a Mon Sep 17 00:00:00 2001
From: Aevann1
Date: Thu, 22 Sep 2022 07:24:34 +0200
Subject: [PATCH 17/17] add patyl
---
files/assets/emojis.json | 3 ++-
files/assets/images/emojis/patyl.webp | Bin 0 -> 9722 bytes
2 files changed, 2 insertions(+), 1 deletion(-)
create mode 100644 files/assets/images/emojis/patyl.webp
diff --git a/files/assets/emojis.json b/files/assets/emojis.json
index 397e6237d..6f4bb0a8c 100644
--- a/files/assets/emojis.json
+++ b/files/assets/emojis.json
@@ -211,6 +211,7 @@
{"name":"marseyflagus","class":"Marsey Flags"},
{"name":"marseyflagvietnam","class":"Marsey Flags"},
+ {"name":"patyl","class":"Platy","tags":["quper","platypus","mersya","wombiezolf","doodle"]},
{"name":"platyaboriginal","class":"Platy"},
{"name":"platyanime","class":"Platy"},
{"name":"platybanana","class":"Platy"},
@@ -850,4 +851,4 @@
{"name":"kippy","class":"Misc"},
{"name":"onerat","class":"Misc"},
{"name":"gunt","class":"Misc"}
-]
+]
\ No newline at end of file
diff --git a/files/assets/images/emojis/patyl.webp b/files/assets/images/emojis/patyl.webp
new file mode 100644
index 0000000000000000000000000000000000000000..0c4c1e42e6adc16f3b106c008fa1a9a2236183fa
GIT binary patch
literal 9722
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
I000000H