Initial commit of xenu-nntp-import
This commit is contained in:
parent
16c5106c93
commit
a4c3563c17
1 changed files with 75 additions and 0 deletions
75
bin/xenu-nntp-import
Executable file
75
bin/xenu-nntp-import
Executable file
|
@ -0,0 +1,75 @@
|
||||||
|
#! /usr/bin/env python3
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import argparse
|
||||||
|
import traceback
|
||||||
|
|
||||||
|
from xenu_nntp.config import Config
|
||||||
|
from xenu_nntp.db import Database
|
||||||
|
from xenu_nntp.newsgroup import Newsgroup
|
||||||
|
from xenu_nntp.mbox import MBoxReader
|
||||||
|
|
||||||
|
class ImportException(Exception):
|
||||||
|
def __init__(self, path: str, line: int, error: str):
|
||||||
|
self.path = path
|
||||||
|
self.line = line
|
||||||
|
self.error = error
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return "Error importing %s at line %d: %s" % (
|
||||||
|
self.path, self.line, self.error
|
||||||
|
)
|
||||||
|
|
||||||
|
class Importer():
|
||||||
|
def __init__(self, db: Database, newsgroup: Newsgroup, args):
|
||||||
|
self.db = db
|
||||||
|
self.newsgroup = newsgroup
|
||||||
|
self.args = args
|
||||||
|
|
||||||
|
def import_mbox_file(db: Database, newsgroup: Newsgroup, mboxfile: str):
|
||||||
|
reader = MBoxReader(mboxfile)
|
||||||
|
|
||||||
|
try:
|
||||||
|
for message in reader.messages():
|
||||||
|
if self.args.verbose and not self.args.quiet:
|
||||||
|
print(f"Importing message {message.id}")
|
||||||
|
|
||||||
|
db.add(message)
|
||||||
|
|
||||||
|
db.execute(f'insert into newsgroup_message values (%s, %s)',
|
||||||
|
(newsgroup.id, message.id))
|
||||||
|
except Exception as e:
|
||||||
|
raise ImportException(mboxfile, reader.line, str(e))
|
||||||
|
|
||||||
|
parser = argparse.ArgumentParser(description='Create new account')
|
||||||
|
parser.add_argument('--dry-run', action='store_true', help='Do not commit to database')
|
||||||
|
parser.add_argument('--quiet', action='store_true', help='Do not print errors')
|
||||||
|
parser.add_argument('--verbose', action='store_true', help='Print messages when importing files and messages')
|
||||||
|
parser.add_argument('--ignore-errors', action='store_true', help='Do not exit on encountering errors')
|
||||||
|
parser.add_argument('--config-file', '-f', type=str, help='Specify a configuration file location')
|
||||||
|
parser.add_argument('newsgroup', type=str, help='Name of newsgroup to ingest articles into')
|
||||||
|
parser.add_argument('mboxfile', type=str, nargs='+', help='mbox file to ingest')
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
config = Config.load(args.config_file)
|
||||||
|
db = Database.from_config(config)
|
||||||
|
newsgroup = db.get(Newsgroup, {'name': args.newsgroup})
|
||||||
|
|
||||||
|
db.execute("begin transaction")
|
||||||
|
|
||||||
|
for mboxfile in args.mboxfile:
|
||||||
|
if args.verbose and not args.quiet:
|
||||||
|
print(f"Importing mbox file {mboxfile}")
|
||||||
|
|
||||||
|
try:
|
||||||
|
import_mbox_file(db, newsgroup, mboxfile)
|
||||||
|
except ImportException as e:
|
||||||
|
if not args.quiet:
|
||||||
|
print(str(e), file=sys.stderr)
|
||||||
|
|
||||||
|
if not args.ignore_errors:
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
if not args.dry_run:
|
||||||
|
db.commit()
|
Loading…
Add table
Reference in a new issue