mirror of https://gitlab.com/bashrc2/epicyon
Convert rss feed items to activitypub posts
parent
7bcabea021
commit
6208a3f00f
|
@ -11534,7 +11534,9 @@ def runDaemon(newsInstance: bool,
|
||||||
print('Creating newswire thread')
|
print('Creating newswire thread')
|
||||||
httpd.thrNewswireDaemon = \
|
httpd.thrNewswireDaemon = \
|
||||||
threadWithTrace(target=runNewswireDaemon,
|
threadWithTrace(target=runNewswireDaemon,
|
||||||
args=(baseDir, httpd, 'newswire'), daemon=True)
|
args=(baseDir, httpd,
|
||||||
|
httpPrefix, domain, port,
|
||||||
|
httpd.translate), daemon=True)
|
||||||
|
|
||||||
# flags used when restarting the inbox queue
|
# flags used when restarting the inbox queue
|
||||||
httpd.restartInboxQueueInProgress = False
|
httpd.restartInboxQueueInProgress = False
|
||||||
|
|
|
@ -6,11 +6,76 @@ __maintainer__ = "Bob Mottram"
|
||||||
__email__ = "bob@freedombone.net"
|
__email__ = "bob@freedombone.net"
|
||||||
__status__ = "Production"
|
__status__ = "Production"
|
||||||
|
|
||||||
|
import os
|
||||||
import time
|
import time
|
||||||
from newswire import getDictFromNewswire
|
from newswire import getDictFromNewswire
|
||||||
|
from posts import createNewsPost
|
||||||
|
from utils import saveJson
|
||||||
|
|
||||||
|
|
||||||
def runNewswireDaemon(baseDir: str, httpd, unused: str):
|
def updateFeedsIndex(baseDir: str, filename: str) -> None:
|
||||||
|
"""Updates the index used for imported RSS feeds
|
||||||
|
"""
|
||||||
|
indexFilename = baseDir + '/accounts/feeds.index'
|
||||||
|
|
||||||
|
if os.path.isfile(indexFilename):
|
||||||
|
if filename not in open(indexFilename).read():
|
||||||
|
try:
|
||||||
|
with open(indexFilename, 'r+') as feedsFile:
|
||||||
|
content = feedsFile.read()
|
||||||
|
feedsFile.seek(0, 0)
|
||||||
|
feedsFile.write(filename + '\n' + content)
|
||||||
|
print('DEBUG: feeds post added to index')
|
||||||
|
except Exception as e:
|
||||||
|
print('WARN: Failed to write entry to feeds posts index ' +
|
||||||
|
indexFilename + ' ' + str(e))
|
||||||
|
else:
|
||||||
|
feedsFile = open(indexFilename, 'w+')
|
||||||
|
if feedsFile:
|
||||||
|
feedsFile.write(filename + '\n')
|
||||||
|
feedsFile.close()
|
||||||
|
|
||||||
|
|
||||||
|
def convertRSStoActivityPub(baseDir: str, httpPrefix: str,
|
||||||
|
domain: str, port: int,
|
||||||
|
newswire: {},
|
||||||
|
translate: {}) -> None:
|
||||||
|
"""Converts rss items in a newswire into posts
|
||||||
|
"""
|
||||||
|
basePath = baseDir + '/accounts/feeds'
|
||||||
|
if not os.path.isdir(basePath):
|
||||||
|
os.mkdir(basePath)
|
||||||
|
|
||||||
|
nickname = 'feeds'
|
||||||
|
|
||||||
|
for dateStr, item in newswire.items():
|
||||||
|
dateStr = dateStr.replace(' ', 'T')
|
||||||
|
dateStr = dateStr.replace('+00:00', 'Z')
|
||||||
|
|
||||||
|
filename = basePath + '/' + dateStr + '.json'
|
||||||
|
if os.path.isfile(filename):
|
||||||
|
continue
|
||||||
|
|
||||||
|
rssTitle = item[0]
|
||||||
|
url = item[1]
|
||||||
|
rssDescription = item[4]
|
||||||
|
if rssDescription:
|
||||||
|
rssDescription += \
|
||||||
|
'\n\n' + translate['Read more...'] + '\n' + url
|
||||||
|
else:
|
||||||
|
rssDescription = url
|
||||||
|
blog = createNewsPost(baseDir,
|
||||||
|
nickname, domain, port,
|
||||||
|
httpPrefix, dateStr,
|
||||||
|
rssTitle, rssDescription,
|
||||||
|
None, None, None, False)
|
||||||
|
if saveJson(blog, filename):
|
||||||
|
updateFeedsIndex(baseDir, filename)
|
||||||
|
|
||||||
|
|
||||||
|
def runNewswireDaemon(baseDir: str, httpd,
|
||||||
|
httpPrefix: str, domain: str, port: int,
|
||||||
|
translate: {}) -> None:
|
||||||
"""Periodically updates RSS feeds
|
"""Periodically updates RSS feeds
|
||||||
"""
|
"""
|
||||||
# initial sleep to allow the system to start up
|
# initial sleep to allow the system to start up
|
||||||
|
@ -33,6 +98,12 @@ def runNewswireDaemon(baseDir: str, httpd, unused: str):
|
||||||
|
|
||||||
httpd.newswire = newNewswire
|
httpd.newswire = newNewswire
|
||||||
print('Newswire updated')
|
print('Newswire updated')
|
||||||
|
|
||||||
|
convertRSStoActivityPub(baseDir,
|
||||||
|
httpPrefix, domain, port,
|
||||||
|
newNewswire, translate)
|
||||||
|
print('Newswire feed converted to ActivityPub')
|
||||||
|
|
||||||
# wait a while before the next feeds update
|
# wait a while before the next feeds update
|
||||||
time.sleep(1200)
|
time.sleep(1200)
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,6 @@ __email__ = "bob@freedombone.net"
|
||||||
__status__ = "Production"
|
__status__ = "Production"
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import time
|
|
||||||
import requests
|
import requests
|
||||||
from socket import error as SocketError
|
from socket import error as SocketError
|
||||||
import errno
|
import errno
|
||||||
|
|
3
posts.py
3
posts.py
|
@ -1195,7 +1195,7 @@ def createBlogPost(baseDir: str,
|
||||||
|
|
||||||
def createNewsPost(baseDir: str,
|
def createNewsPost(baseDir: str,
|
||||||
nickname: str, domain: str, port: int, httpPrefix: str,
|
nickname: str, domain: str, port: int, httpPrefix: str,
|
||||||
rssTitle: str, rssDescription: str,
|
published: str, rssTitle: str, rssDescription: str,
|
||||||
attachImageFilename: str, mediaType: str,
|
attachImageFilename: str, mediaType: str,
|
||||||
imageDescription: str, useBlurhash: bool) -> {}:
|
imageDescription: str, useBlurhash: bool) -> {}:
|
||||||
"""Converts title and description from an rss feed into a post
|
"""Converts title and description from an rss feed into a post
|
||||||
|
@ -1225,6 +1225,7 @@ def createNewsPost(baseDir: str,
|
||||||
schedulePost,
|
schedulePost,
|
||||||
eventDate, eventTime, location)
|
eventDate, eventTime, location)
|
||||||
blog['object']['type'] = 'Article'
|
blog['object']['type'] = 'Article'
|
||||||
|
blog['object']['published'] = published
|
||||||
return blog
|
return blog
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -304,5 +304,6 @@
|
||||||
"Vote": "تصويت",
|
"Vote": "تصويت",
|
||||||
"Remove Vote": "إزالة التصويت",
|
"Remove Vote": "إزالة التصويت",
|
||||||
"This is a news instance": "هذا مثال أخبار",
|
"This is a news instance": "هذا مثال أخبار",
|
||||||
"News": "أخبار"
|
"News": "أخبار",
|
||||||
|
"Read more...": ""
|
||||||
}
|
}
|
||||||
|
|
|
@ -304,5 +304,6 @@
|
||||||
"Vote": "Notícies",
|
"Vote": "Notícies",
|
||||||
"Remove Vote": "Elimina el vot",
|
"Remove Vote": "Elimina el vot",
|
||||||
"This is a news instance": "Aquesta és una instància de notícies",
|
"This is a news instance": "Aquesta és una instància de notícies",
|
||||||
"News": "Notícies"
|
"News": "Notícies",
|
||||||
|
"Read more...": ""
|
||||||
}
|
}
|
||||||
|
|
|
@ -304,5 +304,6 @@
|
||||||
"Vote": "Newyddion",
|
"Vote": "Newyddion",
|
||||||
"Remove Vote": "Tynnwch y Bleidlais",
|
"Remove Vote": "Tynnwch y Bleidlais",
|
||||||
"This is a news instance": "Dyma enghraifft newyddion",
|
"This is a news instance": "Dyma enghraifft newyddion",
|
||||||
"News": "Newyddion"
|
"News": "Newyddion",
|
||||||
|
"Read more...": ""
|
||||||
}
|
}
|
||||||
|
|
|
@ -304,5 +304,6 @@
|
||||||
"Vote": "Abstimmung",
|
"Vote": "Abstimmung",
|
||||||
"Remove Vote": "Abstimmung entfernen",
|
"Remove Vote": "Abstimmung entfernen",
|
||||||
"This is a news instance": "Dies ist eine Nachrichteninstanz",
|
"This is a news instance": "Dies ist eine Nachrichteninstanz",
|
||||||
"News": "Nachrichten"
|
"News": "Nachrichten",
|
||||||
|
"Read more...": ""
|
||||||
}
|
}
|
||||||
|
|
|
@ -304,5 +304,6 @@
|
||||||
"Vote": "Vote",
|
"Vote": "Vote",
|
||||||
"Remove Vote": "Remove Vote",
|
"Remove Vote": "Remove Vote",
|
||||||
"This is a news instance": "This is a news instance",
|
"This is a news instance": "This is a news instance",
|
||||||
"News": "News"
|
"News": "News",
|
||||||
|
"Read more...": "Read more..."
|
||||||
}
|
}
|
||||||
|
|
|
@ -304,5 +304,6 @@
|
||||||
"Vote": "Votar",
|
"Vote": "Votar",
|
||||||
"Remove Vote": "Eliminar voto",
|
"Remove Vote": "Eliminar voto",
|
||||||
"This is a news instance": "Esta es una instancia de noticias",
|
"This is a news instance": "Esta es una instancia de noticias",
|
||||||
"News": "Noticias"
|
"News": "Noticias",
|
||||||
|
"Read more...": ""
|
||||||
}
|
}
|
||||||
|
|
|
@ -304,5 +304,6 @@
|
||||||
"Vote": "Voter",
|
"Vote": "Voter",
|
||||||
"Remove Vote": "Supprimer le vote",
|
"Remove Vote": "Supprimer le vote",
|
||||||
"This is a news instance": "Ceci est une instance d'actualité",
|
"This is a news instance": "Ceci est une instance d'actualité",
|
||||||
"News": "Nouvelles"
|
"News": "Nouvelles",
|
||||||
|
"Read more...": ""
|
||||||
}
|
}
|
||||||
|
|
|
@ -304,5 +304,6 @@
|
||||||
"Vote": "Vóta",
|
"Vote": "Vóta",
|
||||||
"Remove Vote": "Bain Vóta",
|
"Remove Vote": "Bain Vóta",
|
||||||
"This is a news instance": "Is sampla nuachta é seo",
|
"This is a news instance": "Is sampla nuachta é seo",
|
||||||
"News": "Nuacht"
|
"News": "Nuacht",
|
||||||
|
"Read more...": ""
|
||||||
}
|
}
|
||||||
|
|
|
@ -304,5 +304,6 @@
|
||||||
"Vote": "वोट",
|
"Vote": "वोट",
|
||||||
"Remove Vote": "वोट हटा दें",
|
"Remove Vote": "वोट हटा दें",
|
||||||
"This is a news instance": "यह एक समाचार का उदाहरण है",
|
"This is a news instance": "यह एक समाचार का उदाहरण है",
|
||||||
"News": "समाचार"
|
"News": "समाचार",
|
||||||
|
"Read more...": ""
|
||||||
}
|
}
|
||||||
|
|
|
@ -304,5 +304,6 @@
|
||||||
"Vote": "Votazione",
|
"Vote": "Votazione",
|
||||||
"Remove Vote": "Rimuovi voto",
|
"Remove Vote": "Rimuovi voto",
|
||||||
"This is a news instance": "Questa è un'istanza di notizie",
|
"This is a news instance": "Questa è un'istanza di notizie",
|
||||||
"News": "Notizia"
|
"News": "Notizia",
|
||||||
|
"Read more...": ""
|
||||||
}
|
}
|
||||||
|
|
|
@ -304,5 +304,6 @@
|
||||||
"Vote": "投票",
|
"Vote": "投票",
|
||||||
"Remove Vote": "投票を削除",
|
"Remove Vote": "投票を削除",
|
||||||
"This is a news instance": "これはニュースインスタンスです",
|
"This is a news instance": "これはニュースインスタンスです",
|
||||||
"News": "ニュース"
|
"News": "ニュース",
|
||||||
|
"Read more...": ""
|
||||||
}
|
}
|
||||||
|
|
|
@ -300,5 +300,6 @@
|
||||||
"Vote": "Vote",
|
"Vote": "Vote",
|
||||||
"Remove Vote": "Remove Vote",
|
"Remove Vote": "Remove Vote",
|
||||||
"This is a news instance": "This is a news instance",
|
"This is a news instance": "This is a news instance",
|
||||||
"News": "News"
|
"News": "News",
|
||||||
|
"Read more...": "Read more..."
|
||||||
}
|
}
|
||||||
|
|
|
@ -304,5 +304,6 @@
|
||||||
"Vote": "Voto",
|
"Vote": "Voto",
|
||||||
"Remove Vote": "Remover voto",
|
"Remove Vote": "Remover voto",
|
||||||
"This is a news instance": "Esta é uma instância de notícias",
|
"This is a news instance": "Esta é uma instância de notícias",
|
||||||
"News": "Notícia"
|
"News": "Notícia",
|
||||||
|
"Read more...": ""
|
||||||
}
|
}
|
||||||
|
|
|
@ -304,5 +304,6 @@
|
||||||
"Vote": "Голос",
|
"Vote": "Голос",
|
||||||
"Remove Vote": "Удалить голос",
|
"Remove Vote": "Удалить голос",
|
||||||
"This is a news instance": "Это новостной экземпляр",
|
"This is a news instance": "Это новостной экземпляр",
|
||||||
"News": "Новости"
|
"News": "Новости",
|
||||||
|
"Read more...": ""
|
||||||
}
|
}
|
||||||
|
|
|
@ -304,5 +304,6 @@
|
||||||
"Vote": "投票",
|
"Vote": "投票",
|
||||||
"Remove Vote": "删除投票",
|
"Remove Vote": "删除投票",
|
||||||
"This is a news instance": "这是一个新闻实例",
|
"This is a news instance": "这是一个新闻实例",
|
||||||
"News": "新闻"
|
"News": "新闻",
|
||||||
|
"Read more...": ""
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue