lib.itmens/journal/importers/opml.py
2024-06-07 22:44:28 -04:00

67 lines
2.4 KiB
Python

import django_rq
import listparser
from auditlog.context import set_actor
from django.utils.translation import gettext as _
from loguru import logger
from user_messages import api as msg
from catalog.common import *
from catalog.common.downloaders import *
from catalog.sites.rss import RSS
from journal.models import *
class OPMLImporter:
def __init__(self, user, visibility, mode):
self.user = user
self.visibility = visibility
self.mode = mode
def parse_file(self, uploaded_file):
return listparser.parse(uploaded_file.read()).feeds
def import_from_file(self, uploaded_file):
feeds = self.parse_file(uploaded_file)
if not feeds:
return False
django_rq.get_queue("import").enqueue(self.import_from_file_task, feeds)
return True
def import_from_file_task(self, feeds):
logger.info(f"{self.user} import opml start")
skip = 0
collection = None
with set_actor(self.user):
if self.mode == 1:
title = _("{username}'s podcast subscriptions").format(
username=self.user.display_name
)
collection = Collection.objects.create(
owner=self.user.identity, title=title
)
for feed in feeds:
logger.info(f"{self.user} import {feed.url}")
try:
res = RSS(feed.url).get_resource_ready()
except Exception:
res = None
if not res or not res.item:
logger.warning(f"{self.user} feed error {feed.url}")
continue
item = res.item
if self.mode == 0:
mark = Mark(self.user.identity, item)
if mark.shelfmember:
logger.info(f"{self.user} marked, skip {feed.url}")
skip += 1
else:
mark.update(
ShelfType.PROGRESS, None, None, visibility=self.visibility
)
elif self.mode == 1 and collection:
collection.append_item(item)
logger.info(f"{self.user} import opml end")
msg.success(
self.user,
f"OPML import complete, {len(feeds)} feeds processed, {skip} exisiting feeds skipped.",
)