diff --git a/daemon.py b/daemon.py
index dabaefb56..01cf419b3 100644
--- a/daemon.py
+++ b/daemon.py
@@ -204,6 +204,8 @@ from devices import E2EEdevicesCollection
from devices import E2EEvalidDevice
from devices import E2EEaddDevice
from newswire import getRSSfromDict
+from newswire import runNewswireWatchdog
+from newswire import runNewswireDaemon
import os
@@ -1066,7 +1068,8 @@ class PubServer(BaseHTTPRequestHandler):
if self.path.startswith('/icons/') or \
self.path.startswith('/avatars/') or \
- self.path.startswith('/favicon.ico'):
+ self.path.startswith('/favicon.ico') or \
+ self.path.startswith('/newswire.xml'):
return False
# token based authenticated used by the web interface
@@ -5900,7 +5903,8 @@ class PubServer(BaseHTTPRequestHandler):
httpPrefix,
projectVersion,
self._isMinimal(nickname),
- YTReplacementDomain)
+ YTReplacementDomain,
+ self.server.newswire)
if GETstartTime:
self._benchmarkGETtimings(GETstartTime, GETtimings,
'show status done',
@@ -6006,7 +6010,8 @@ class PubServer(BaseHTTPRequestHandler):
httpPrefix,
self.server.projectVersion,
self._isMinimal(nickname),
- self.server.YTReplacementDomain)
+ self.server.YTReplacementDomain,
+ self.server.newswire)
msg = msg.encode('utf-8')
self._set_headers('text/html', len(msg),
cookie, callingDomain)
@@ -6106,7 +6111,8 @@ class PubServer(BaseHTTPRequestHandler):
httpPrefix,
self.server.projectVersion,
self._isMinimal(nickname),
- self.server.YTReplacementDomain)
+ self.server.YTReplacementDomain,
+ self.server.newswire)
msg = msg.encode('utf-8')
self._set_headers('text/html', len(msg),
cookie, callingDomain)
@@ -6206,7 +6212,8 @@ class PubServer(BaseHTTPRequestHandler):
httpPrefix,
self.server.projectVersion,
self._isMinimal(nickname),
- self.server.YTReplacementDomain)
+ self.server.YTReplacementDomain,
+ self.server.newswire)
msg = msg.encode('utf-8')
self._set_headers('text/html', len(msg),
cookie, callingDomain)
@@ -6306,7 +6313,8 @@ class PubServer(BaseHTTPRequestHandler):
httpPrefix,
self.server.projectVersion,
self._isMinimal(nickname),
- self.server.YTReplacementDomain)
+ self.server.YTReplacementDomain,
+ self.server.newswire)
msg = msg.encode('utf-8')
self._set_headers('text/html', len(msg),
cookie, callingDomain)
@@ -6381,7 +6389,8 @@ class PubServer(BaseHTTPRequestHandler):
self.server.allowDeletion,
httpPrefix,
self.server.projectVersion,
- self.server.YTReplacementDomain)
+ self.server.YTReplacementDomain,
+ self.server.newswire)
msg = msg.encode('utf-8')
self._set_headers('text/html', len(msg),
cookie, callingDomain)
@@ -6465,7 +6474,8 @@ class PubServer(BaseHTTPRequestHandler):
httpPrefix,
self.server.projectVersion,
self._isMinimal(nickname),
- self.server.YTReplacementDomain)
+ self.server.YTReplacementDomain,
+ self.server.newswire)
msg = msg.encode('utf-8')
self._set_headers('text/html', len(msg),
cookie, callingDomain)
@@ -6568,7 +6578,8 @@ class PubServer(BaseHTTPRequestHandler):
httpPrefix,
self.server.projectVersion,
self._isMinimal(nickname),
- self.server.YTReplacementDomain)
+ self.server.YTReplacementDomain,
+ self.server.newswire)
msg = msg.encode('utf-8')
self._set_headers('text/html', len(msg),
cookie, callingDomain)
@@ -6661,7 +6672,8 @@ class PubServer(BaseHTTPRequestHandler):
httpPrefix,
self.server.projectVersion,
self._isMinimal(nickname),
- self.server.YTReplacementDomain)
+ self.server.YTReplacementDomain,
+ self.server.newswire)
msg = msg.encode('utf-8')
self._set_headers('text/html', len(msg),
cookie, callingDomain)
@@ -6746,7 +6758,8 @@ class PubServer(BaseHTTPRequestHandler):
True,
httpPrefix,
self.server.projectVersion,
- self.server.YTReplacementDomain)
+ self.server.YTReplacementDomain,
+ self.server.newswire)
msg = msg.encode('utf-8')
self._set_headers('text/html', len(msg),
cookie, callingDomain)
@@ -11251,11 +11264,17 @@ def runDaemon(blogsInstance: bool, mediaInstance: bool,
allowDeletion, debug, maxMentions, maxEmoji,
httpd.translate, unitTest,
httpd.YTReplacementDomain), daemon=True)
+
print('Creating scheduled post thread')
httpd.thrPostSchedule = \
threadWithTrace(target=runPostSchedule,
args=(baseDir, httpd, 20), daemon=True)
+ print('Creating newswire thread')
+ httpd.thrNewswireDaemon = \
+ threadWithTrace(target=runNewswireDaemon,
+ args=(baseDir, httpd), daemon=True)
+
# flags used when restarting the inbox queue
httpd.restartInboxQueueInProgress = False
httpd.restartInboxQueue = False
@@ -11272,6 +11291,12 @@ def runDaemon(blogsInstance: bool, mediaInstance: bool,
threadWithTrace(target=runPostScheduleWatchdog,
args=(projectVersion, httpd), daemon=True)
httpd.thrWatchdogSchedule.start()
+
+ print('Creating newswire watchdog')
+ httpd.thrNewswireWatchdog = \
+ threadWithTrace(target=runNewswireWatchdog,
+ args=(projectVersion, httpd), daemon=True)
+ httpd.thrNewswireWatchdog.start()
else:
httpd.thrInboxQueue.start()
httpd.thrPostSchedule.start()
diff --git a/epicyon-profile.css b/epicyon-profile.css
index eac77ae78..ebf9d99a4 100644
--- a/epicyon-profile.css
+++ b/epicyon-profile.css
@@ -14,6 +14,7 @@
--main-header-color-roles: #282237;
--main-fg-color: #dddddd;
--column-left-fg-color: #dddddd;
+ --column-right-fg-color: #dddddd;
--main-link-color: #999;
--main-link-color-hover: #bbb;
--main-visited-color: #888;
@@ -24,6 +25,7 @@
--font-color-header: #ccc;
--font-size-button-mobile: 34px;
--font-size-links: 18px;
+ --font-size-newswire: 18px;
--font-size: 30px;
--font-size2: 24px;
--font-size3: 38px;
@@ -64,6 +66,7 @@
--quote-font-weight: normal;
--quote-font-size: 120%;
--line-spacing: 130%;
+ --line-spacing-newswire: 100%;
--column-left-width: 10vw;
--column-center-width: 80vw;
--column-right-width: 10vw;
@@ -72,6 +75,7 @@
--column-left-header-size: 20px;
--column-left-icon-size: 20%;
--column-right-icon-size: 20%;
+ --newswire-date-color: white;
}
@font-face {
@@ -221,6 +225,18 @@ a:focus {
width: 50%;
}
+.newswireItem {
+ font-size: var(--font-size-newswire);
+ color: var(--column-right-fg-color);
+ line-height: var(--line-spacing-newswire);
+}
+
+.newswireDate {
+ font-size: var(--font-size-newswire);
+ color: var(--newswire-date-color);
+ float: right;
+}
+
.new-post-text {
font-size: var(--font-size2);
font-family: Arial, Helvetica, sans-serif;
@@ -1007,6 +1023,7 @@ aside .toggle-inside li {
.col-right {
background-color: var(--column-left-color);
color: var(--column-left-fg-color);
+ padding-left: 10px;
padding-right: 30px;
font-size: var(--font-size-links);
width: var(--column-right-width);
diff --git a/newswire.py b/newswire.py
index d295b1273..111ad6bf7 100644
--- a/newswire.py
+++ b/newswire.py
@@ -7,6 +7,7 @@ __email__ = "bob@freedombone.net"
__status__ = "Production"
import os
+import time
import requests
from socket import error as SocketError
import errno
@@ -144,10 +145,16 @@ def getRSSfromDict(baseDir: str, newswire: {},
None, domainFull,
'Newswire', translate)
for published, fields in newswire.items():
+ published = published.replace('+00:00', 'Z').strip()
+ published = published.replace(' ', 'T')
+ try:
+ pubDate = datetime.strptime(published, "%Y-%m-%dT%H:%M:%SZ")
+ except BaseException:
+ continue
rssStr += '
' + \ + '' + item[0] + '' + htmlStr += '
' + return htmlStr + + def getRightColumnContent(baseDir: str, nickname: str, domainFull: str, httpPrefix: str, translate: {}, - iconsDir: str, moderator: bool) -> str: + iconsDir: str, moderator: bool, + newswire: {}) -> str: """Returns html content for the right column """ htmlStr = '' @@ -5400,6 +5413,7 @@ def getRightColumnContent(baseDir: str, nickname: str, domainFull: str, else: htmlStr += '