Convert rss feed items to activitypub posts

merge-requests/8/head
Bob Mottram 2020-10-07 14:51:29 +01:00
parent 7bcabea021
commit 6208a3f00f
19 changed files with 107 additions and 19 deletions

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -304,5 +304,6 @@
"Vote": "تصويت", "Vote": "تصويت",
"Remove Vote": "إزالة التصويت", "Remove Vote": "إزالة التصويت",
"This is a news instance": "هذا مثال أخبار", "This is a news instance": "هذا مثال أخبار",
"News": "أخبار" "News": "أخبار",
"Read more...": ""
} }

View File

@ -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...": ""
} }

View File

@ -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...": ""
} }

View File

@ -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...": ""
} }

View File

@ -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..."
} }

View File

@ -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...": ""
} }

View File

@ -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...": ""
} }

View File

@ -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...": ""
} }

View File

@ -304,5 +304,6 @@
"Vote": "वोट", "Vote": "वोट",
"Remove Vote": "वोट हटा दें", "Remove Vote": "वोट हटा दें",
"This is a news instance": "यह एक समाचार का उदाहरण है", "This is a news instance": "यह एक समाचार का उदाहरण है",
"News": "समाचार" "News": "समाचार",
"Read more...": ""
} }

View File

@ -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...": ""
} }

View File

@ -304,5 +304,6 @@
"Vote": "投票", "Vote": "投票",
"Remove Vote": "投票を削除", "Remove Vote": "投票を削除",
"This is a news instance": "これはニュースインスタンスです", "This is a news instance": "これはニュースインスタンスです",
"News": "ニュース" "News": "ニュース",
"Read more...": ""
} }

View File

@ -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..."
} }

View File

@ -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...": ""
} }

View File

@ -304,5 +304,6 @@
"Vote": "Голос", "Vote": "Голос",
"Remove Vote": "Удалить голос", "Remove Vote": "Удалить голос",
"This is a news instance": "Это новостной экземпляр", "This is a news instance": "Это новостной экземпляр",
"News": "Новости" "News": "Новости",
"Read more...": ""
} }

View File

@ -304,5 +304,6 @@
"Vote": "投票", "Vote": "投票",
"Remove Vote": "删除投票", "Remove Vote": "删除投票",
"This is a news instance": "这是一个新闻实例", "This is a news instance": "这是一个新闻实例",
"News": "新闻" "News": "新闻",
"Read more...": ""
} }