Anton Shestakov <engored@ya.ru>, Thu, 25 Sep 2014 14:35:55 +0900
Youtube-watch script.
youtube-watch/watch.py
Permissions: -rw-r--r--
from argparse import ArgumentParser, FileType from calendar import timegm from contextlib import contextmanager from operator import itemgetter from time import localtime, sleep, strftime url = 'https://gdata.youtube.com/feeds/api/users/%s/uploads?v=2' % user feed = feedparser.parse(url) def formatter(template, limit, entries): entries = sorted(entries, key=itemgetter('published_parsed')) entries = entries[-limit:] entry['link'] = entry['link'].replace('&feature=youtube_gdata', '') entry['published_nice'] = strftime('%Y-%m-%d %H:%M:%S', localtime(timegm(entry['published_parsed']))) print template.format(**entry) def get_template(candidate): return templates['default'] elif candidate in templates: return templates[candidate] return candidate.decode('utf-8') 'default': u'{link:<43} | {published_nice:<19} | {author:<25} | {title}', 'long': u'{title}\nBy {author} ({link})' def activity_status(msg): sys.stderr.write('\r' + ' ' * len(msg) + '\r') def fetch_entries(users, delay=0): msg = 'Sleeping for %s' % delay with activity_status(msg): msg = 'Fetching entries for %s' % user with activity_status(msg): entries += user_entries(user) parser = ArgumentParser() parser.add_argument('-U', '--user', action='append', dest='users', help='author of uploads', metavar='USER [+]') parser.add_argument('-F', '--input-file', type=FileType('r'), help='file with users') parser.add_argument('-T', '--template', help='template for python .format()') parser.add_argument('-l', '--limit', type=int, help='limit number of initial videos') parser.add_argument('-f', '--follow', action='store_true', help='continuous mode') parser.add_argument('-d', '--delay', type=int, help='delay for continuous mode', default=60) args = parser.parse_args() template = get_template(args.template) if args.input_file is not None: users += args.input_file.read().splitlines() entries = fetch_entries(users) formatter(template, args.limit, entries) new_entries = [entry for entry in entries if entry['published_parsed'] > earlier] formatter(template, None, new_entries) earlier = max([entry['published_parsed'] for entry in entries]) entries = fetch_entries(users, args.delay) except KeyboardInterrupt: if __name__ == '__main__':