Skip to content

Instantly share code, notes, and snippets.

@dahlia
Last active August 29, 2015 14:02
Show Gist options
  • Save dahlia/c31401f835a99f3414b1 to your computer and use it in GitHub Desktop.
Save dahlia/c31401f835a99f3414b1 to your computer and use it in GitHub Desktop.
Interactively clean up unreachable subscriptions.
*.pyc
.*.swp
.env

This small script helps to unsubscribe old, abandonned, and unreachable subscriptions using interactive prompts. It requires Python 3.2+ and a bleeding-edge libearth 0.3.0 which is not released yet as of June 5, 2014.

You can see the usage through --help option.

#!/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()
libearth >= 0.3.0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment