lib.itmens/journal/importers/opml.py

84 lines
3 KiB
Python
Raw Permalink Normal View History

import listparser
2024-06-07 22:29:10 -04:00
from django.utils.translation import gettext as _
2023-08-11 12:53:27 -04:00
from loguru import logger
2023-01-29 20:05:30 -05:00
from catalog.common import *
from catalog.common.downloaders import *
from catalog.sites.rss import RSS
2023-01-29 20:05:30 -05:00
from journal.models import *
from users.models.task import Task
2023-01-29 20:05:30 -05:00
class OPMLImporter(Task):
class Meta:
app_label = "journal" # workaround bug in TypedModel
2023-01-29 20:05:30 -05:00
TaskQueue = "import"
DefaultMetadata = {
"total": 0,
"mode": 0,
"processed": 0,
"skipped": 0,
"imported": 0,
"failed": 0,
"visibility": 0,
"failed_urls": [],
"file": None,
}
2023-01-29 20:05:30 -05:00
@classmethod
def validate_file(cls, f):
try:
return bool(listparser.parse(f.read()).feeds)
except Exception:
2023-01-29 20:05:30 -05:00
return False
def run(self):
with open(self.metadata["file"], "r") as f:
feeds = listparser.parse(f.read()).feeds
self.metadata["total"] = len(feeds)
self.message = f"Processing {self.metadata['total']} feeds."
self.save(update_fields=["metadata", "message"])
collection = None
if self.metadata["mode"] == 1:
2024-05-15 20:41:03 -04:00
title = _("{username}'s podcast subscriptions").format(
username=self.user.display_name
)
2023-08-11 12:53:27 -04:00
collection = Collection.objects.create(
owner=self.user.identity,
title=title,
visibility=self.metadata["visibility"],
2023-08-11 12:53:27 -04:00
)
for feed in feeds:
logger.info(f"{self.user} import {feed.url}")
2023-12-31 07:41:08 -05:00
try:
res = RSS(feed.url).get_resource_ready()
2024-04-06 00:13:50 -04:00
except Exception:
2023-12-31 07:41:08 -05:00
res = None
2023-12-31 08:32:19 -05:00
if not res or not res.item:
2023-12-09 23:26:27 -05:00
logger.warning(f"{self.user} feed error {feed.url}")
self.metadata["failed"] += 1
2023-08-11 12:53:27 -04:00
continue
item = res.item
if self.metadata["mode"] == 0:
2023-11-28 17:13:47 -05:00
mark = Mark(self.user.identity, item)
2023-08-11 12:53:27 -04:00
if mark.shelfmember:
logger.info(f"{self.user} marked, skip {feed.url}")
self.metadata["skipped"] += 1
2023-08-11 12:53:27 -04:00
else:
self.metadata["imported"] += 1
2023-08-11 12:53:27 -04:00
mark.update(
ShelfType.PROGRESS,
None,
None,
visibility=self.metadata["visibility"],
2023-08-11 12:53:27 -04:00
)
elif self.metadata["mode"] == 1 and collection:
self.metadata["imported"] += 1
2023-08-11 12:53:27 -04:00
collection.append_item(item)
self.metadata["processed"] += 1
self.save(update_fields=["metadata"])
self.message = f"{self.metadata['imported']} feeds imported, {self.metadata['skipped']} skipped, {self.metadata['failed']} failed."
self.save(update_fields=["message"])