mirror of https://gitlab.com/bashrc2/epicyon
Add rss feed for blog
parent
32959342ec
commit
da60e16b83
82
blog.py
82
blog.py
|
@ -247,6 +247,27 @@ def htmlBlogPostContent(authorized: bool, \
|
||||||
return blogStr
|
return blogStr
|
||||||
|
|
||||||
|
|
||||||
|
def htmlBlogPostRSS(authorized: bool, \
|
||||||
|
baseDir: str,httpPrefix: str,translate: {}, \
|
||||||
|
nickname: str,domain: str,domainFull: str, \
|
||||||
|
postJsonObject: {}, \
|
||||||
|
handle: str,restrictToDomain: bool) -> str:
|
||||||
|
"""Returns the RSS feed for a single blog post
|
||||||
|
"""
|
||||||
|
messageLink=''
|
||||||
|
if postJsonObject['object'].get('id'):
|
||||||
|
messageLink=postJsonObject['object']['id'].replace('/statuses/','/')
|
||||||
|
if not restrictToDomain or \
|
||||||
|
(restrictToDomain and '/'+domain in messageLink):
|
||||||
|
if postJsonObject['object'].get('summary'):
|
||||||
|
titleStr=postJsonObject['object']['summary']
|
||||||
|
rssStr= ' <item>'
|
||||||
|
rssStr+=' <title>'+titleStr+'</title>'
|
||||||
|
rssStr+=' <link>'+messageLink+'</link>'
|
||||||
|
rssStr+=' </item>'
|
||||||
|
return rssStr
|
||||||
|
|
||||||
|
|
||||||
def htmlBlogPost(authorized: bool, \
|
def htmlBlogPost(authorized: bool, \
|
||||||
baseDir: str,httpPrefix: str,translate: {}, \
|
baseDir: str,httpPrefix: str,translate: {}, \
|
||||||
nickname: str,domain: str,domainFull: str, \
|
nickname: str,domain: str,domainFull: str, \
|
||||||
|
@ -307,6 +328,7 @@ def htmlBlogPage(authorized: bool, session, \
|
||||||
if port!=80 and port!=443:
|
if port!=80 and port!=443:
|
||||||
domainFull=domain+':'+str(port)
|
domainFull=domain+':'+str(port)
|
||||||
|
|
||||||
|
# show previous and next buttons
|
||||||
if pageNumber!=None:
|
if pageNumber!=None:
|
||||||
iconsDir=getIconsDir(baseDir)
|
iconsDir=getIconsDir(baseDir)
|
||||||
navigateStr='<p>'
|
navigateStr='<p>'
|
||||||
|
@ -327,6 +349,12 @@ def htmlBlogPage(authorized: bool, session, \
|
||||||
navigateStr+='</p>'
|
navigateStr+='</p>'
|
||||||
blogStr+=navigateStr
|
blogStr+=navigateStr
|
||||||
|
|
||||||
|
# show rss link
|
||||||
|
blogStr+='<center><p class="rssfeed">'
|
||||||
|
blogStr+='<a href="'+httpPrefix+'://'+domainFull+'/blog/rss.xml">'
|
||||||
|
blogStr+='<img loading="lazy" alt="RSS" title="RSS" src="/'+iconsDir+'/rss.png" />'
|
||||||
|
blogStr+='</a></p></center>'
|
||||||
|
|
||||||
for item in timelineJson['orderedItems']:
|
for item in timelineJson['orderedItems']:
|
||||||
if item['type']!='Create':
|
if item['type']!='Create':
|
||||||
continue
|
continue
|
||||||
|
@ -342,6 +370,60 @@ def htmlBlogPage(authorized: bool, session, \
|
||||||
return blogStr+htmlFooter()
|
return blogStr+htmlFooter()
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
def rssHeader(httpPrefix: str,nickname: str,domainFull: str,translate: {}) -> str:
|
||||||
|
rssStr="<?xml version=\"1.0\" encoding=\"UTF-8\" ?>"
|
||||||
|
rssStr+="<rss version=\"2.0\">"
|
||||||
|
rssStr+='<channel>'
|
||||||
|
rssStr+=' <title>'+translate['Blog']+'</title>'
|
||||||
|
rssStr+=' <link>'+httpPrefix+'://'+domainFull+'/users/'+nickname+'/rss.xml'+'</link>'
|
||||||
|
return rssStr
|
||||||
|
|
||||||
|
def rssFooter() -> str:
|
||||||
|
rssStr='</channel>'
|
||||||
|
rssStr+='</rss>'
|
||||||
|
return rssStr
|
||||||
|
|
||||||
|
def htmlBlogPageRSS(authorized: bool, session, \
|
||||||
|
baseDir: str,httpPrefix: str,translate: {}, \
|
||||||
|
nickname: str,domain: str,port: int, \
|
||||||
|
noOfItems: int,pageNumber: int) -> str:
|
||||||
|
"""Returns an rss feed containing posts
|
||||||
|
"""
|
||||||
|
if ' ' in nickname or '@' in nickname or '\n' in nickname:
|
||||||
|
return None
|
||||||
|
|
||||||
|
domainFull=domain
|
||||||
|
if port:
|
||||||
|
if port!=80 and port!=443:
|
||||||
|
domainFull=domain+':'+str(port)
|
||||||
|
|
||||||
|
blogRSS=rssHeader(httpPrefix,nickname,domainFull,translate)
|
||||||
|
|
||||||
|
blogsIndex= \
|
||||||
|
baseDir+'/accounts/'+nickname+'@'+domain+'/tlblogs.index'
|
||||||
|
if not os.path.isfile(blogsIndex):
|
||||||
|
return blogRSS+rssFooter()
|
||||||
|
|
||||||
|
timelineJson= \
|
||||||
|
createBlogsTimeline(session,baseDir, \
|
||||||
|
nickname,domain,port,httpPrefix, \
|
||||||
|
noOfItems,False,False,pageNumber)
|
||||||
|
|
||||||
|
if not timelineJson:
|
||||||
|
return blogRSS+rssFooter()
|
||||||
|
|
||||||
|
if pageNumber!=None:
|
||||||
|
for item in timelineJson['orderedItems']:
|
||||||
|
if item['type']!='Create':
|
||||||
|
continue
|
||||||
|
|
||||||
|
blogRSS+= \
|
||||||
|
htmlBlogPostRSS(authorized,baseDir,httpPrefix,translate, \
|
||||||
|
nickname,domain,domainFull,item, \
|
||||||
|
None,True)
|
||||||
|
|
||||||
|
return blogRSS+rssFooter()
|
||||||
|
|
||||||
|
|
||||||
def getBlogIndexesForAccounts(baseDir: str) -> {}:
|
def getBlogIndexesForAccounts(baseDir: str) -> {}:
|
||||||
""" Get the index files for blogs for each account
|
""" Get the index files for blogs for each account
|
||||||
|
|
32
daemon.py
32
daemon.py
|
@ -110,6 +110,7 @@ from roles import setRole
|
||||||
from roles import clearModeratorStatus
|
from roles import clearModeratorStatus
|
||||||
from skills import outboxSkills
|
from skills import outboxSkills
|
||||||
from availability import outboxAvailability
|
from availability import outboxAvailability
|
||||||
|
from blog import htmlBlogPageRSS
|
||||||
from blog import htmlBlogView
|
from blog import htmlBlogView
|
||||||
from blog import htmlBlogPage
|
from blog import htmlBlogPage
|
||||||
from blog import htmlBlogPost
|
from blog import htmlBlogPost
|
||||||
|
@ -196,6 +197,9 @@ maxPostsInMediaFeed=6
|
||||||
# Blogs can be longer, so don't show many per page
|
# Blogs can be longer, so don't show many per page
|
||||||
maxPostsInBlogsFeed=4
|
maxPostsInBlogsFeed=4
|
||||||
|
|
||||||
|
# Maximum number of entries in returned rss.xml
|
||||||
|
maxPostsInRSSFeed=10
|
||||||
|
|
||||||
# number of follows/followers per page
|
# number of follows/followers per page
|
||||||
followsPerPage=12
|
followsPerPage=12
|
||||||
|
|
||||||
|
@ -999,6 +1003,34 @@ class PubServer(BaseHTTPRequestHandler):
|
||||||
|
|
||||||
self._benchmarkGETtimings(GETstartTime,GETtimings,8)
|
self._benchmarkGETtimings(GETstartTime,GETtimings,8)
|
||||||
|
|
||||||
|
if self.path.startswith('/blog/') and self.path.endswith('/rss.xml'):
|
||||||
|
nickname=self.path.split('/blog/')[1]
|
||||||
|
if '/' not in nickname:
|
||||||
|
if not nickname.startswith('rss.'):
|
||||||
|
if os.path.isdir(self.server.baseDir+ \
|
||||||
|
'/accounts/'+nickname+ \
|
||||||
|
'@'+self.server.domain):
|
||||||
|
if not self.server.session:
|
||||||
|
self.server.session= \
|
||||||
|
createSession(self.server.useTor)
|
||||||
|
msg= \
|
||||||
|
htmlBlogPageRSS(authorized, \
|
||||||
|
self.server.session, \
|
||||||
|
self.server.baseDir, \
|
||||||
|
self.server.httpPrefix, \
|
||||||
|
self.server.translate, \
|
||||||
|
nickname, \
|
||||||
|
self.server.domain, \
|
||||||
|
self.server.port, \
|
||||||
|
maxPostsInRSSFeed,1)
|
||||||
|
if msg!=None:
|
||||||
|
msg=msg.encode()
|
||||||
|
self._set_headers('application/rss+xml',len(msg),cookie)
|
||||||
|
self._write(msg)
|
||||||
|
return
|
||||||
|
self._404()
|
||||||
|
return
|
||||||
|
|
||||||
# show the main blog page
|
# show the main blog page
|
||||||
if htmlGET and (self.path=='/blog' or \
|
if htmlGET and (self.path=='/blog' or \
|
||||||
self.path=='/blog/' or \
|
self.path=='/blog/' or \
|
||||||
|
|
|
@ -90,6 +90,10 @@ a:link {
|
||||||
position: relative;
|
position: relative;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.rssfeed img {
|
||||||
|
width: 5%;
|
||||||
|
}
|
||||||
|
|
||||||
.ssbaddr {
|
.ssbaddr {
|
||||||
font-size: var(--font-size5);
|
font-size: var(--font-size5);
|
||||||
}
|
}
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 7.4 KiB |
Binary file not shown.
After Width: | Height: | Size: 7.4 KiB |
Binary file not shown.
After Width: | Height: | Size: 7.4 KiB |
Binary file not shown.
After Width: | Height: | Size: 7.4 KiB |
Loading…
Reference in New Issue