|
#!/usr/bin/env python |
|
from __future__ import print_function |
|
|
|
import argparse |
|
import logging |
|
import traceback |
|
import urllib.parse |
|
|
|
from libearth.crawler import CrawlError, get_feed |
|
from libearth.session import Session |
|
from libearth.stage import Stage |
|
from libearth.subscribe import Subscription, SubscriptionSet |
|
from libearth.repository import FileSystemRepository, from_url |
|
|
|
|
|
parser = argparse.ArgumentParser( |
|
description='Interactively clean up unreachable subscriptions' |
|
) |
|
parser.add_argument('repository', help='repository for Earth Reader') |
|
parser.add_argument('-i', '--session-id', default=Session().identifier, |
|
help='session identifier [default: %(default)s]') |
|
parser.add_argument('-v', '--verbose', default=False, action='store_true', |
|
help='verbose mode') |
|
|
|
|
|
def unsubscribe(subscriptions, feed_uri): |
|
for sub in subscriptions: |
|
if isinstance(sub, Subscription) and sub.feed_uri == feed_uri: |
|
break |
|
elif isinstance(sub, SubscriptionSet): |
|
unsubscribe(sub, feed_uri) |
|
else: |
|
return |
|
subscriptions.remove(sub) |
|
|
|
|
|
def main(): |
|
args = parser.parse_args() |
|
level = logging.INFO if args.verbose else logging.ERROR |
|
logging.basicConfig(level=level) |
|
session = Session(args.session_id) |
|
if urllib.parse.urlparse(args.repository).scheme: |
|
try: |
|
repo = from_url(args.repository) |
|
except LookupError as e: |
|
parser.error(str(e)) |
|
else: |
|
try: |
|
repo = FileSystemRepository(args.repository) |
|
except (IOError, OSError) as e: |
|
parser.error(str(e)) |
|
stage = Stage(session, repo) |
|
with stage: |
|
feed_uris = { |
|
sub.feed_uri: sub.label |
|
for sub in stage.subscriptions.recursive_subscriptions |
|
} |
|
feeds_len = len(feed_uris) |
|
index_format = '[{{0:{0}d}}/{{1:{0}d}}]'.format(len(str(feeds_len))) |
|
for i, (feed_uri, title) in enumerate(feed_uris.items()): |
|
try: |
|
print(index_format.format(i + 1, feeds_len), feed_uri) |
|
try: |
|
get_feed(feed_uri) |
|
except CrawlError: |
|
traceback.print_exc() |
|
answer = input( |
|
'Unsubscribe this "{0}" <{1}>? '.format(title, feed_uri) |
|
) |
|
if answer and answer.strip().lower() in ('y', 'yes'): |
|
with stage: |
|
subscriptions = stage.subscriptions |
|
unsubscribe(subscriptions, feed_uri) |
|
stage.subscriptions = subscriptions |
|
else: |
|
print(feed_uri) |
|
except KeyboardInterrupt: |
|
break |
|
|
|
|
|
if __name__ == '__main__': |
|
main() |