this repo has no description
1#!/usr/bin/env python3
2
3from flask import Flask, request, jsonify
4from prometheus_client import Counter, make_wsgi_app
5from werkzeug.middleware.dispatcher import DispatcherMiddleware
6from werkzeug.datastructures import LanguageAccept
7
8from feed_manager import feed_manager
9
10feed_requests = Counter('feed_requests', 'requests by feed URI', ['feed'])
11
12app = Flask(__name__)
13
14@app.route('/xrpc/app.bsky.feed.getFeedSkeleton')
15def get_feed_skeleton():
16 try:
17 limit = int(request.args.get('limit', 50))
18 except ValueError:
19 limit = 50
20
21 if 'nz-interesting' in request.args['feed']:
22 offset = request.args.get('cursor')
23 else:
24 try:
25 offset = int(request.args.get('cursor', 0))
26 except ValueError:
27 offset = 0
28
29 feed_uri = request.args['feed']
30 if feed_uri.endswith('-dev'):
31 feed_uri = feed_uri.replace('-dev', '')
32 else:
33 (prefix, sep, rkey) = feed_uri.rpartition('/')
34 feed_requests.labels(rkey).inc()
35
36 if request.args.getlist('langs'):
37 req_langs = request.args.getlist('langs')
38 langs = LanguageAccept([(l, 1) for l in req_langs])
39 else:
40 langs = request.accept_languages
41
42 if request.args.get('debug', '0') == '1':
43 headers = {'Content-Type': 'text/plain; charset=utf-8'}
44 debug = feed_manager.serve_feed(feed_uri, limit, offset, langs, debug=True)
45 return debug, headers
46
47 posts = feed_manager.serve_feed(feed_uri, limit, offset, langs, debug=False)
48 if isinstance(posts, dict):
49 return posts
50
51 if len(posts) < limit:
52 return dict(feed=[dict(post=uri) for uri in posts])
53 else:
54 offset += len(posts)
55 return dict(cursor=str(offset), feed=[dict(post=uri) for uri in posts])
56
57app.wsgi_app = DispatcherMiddleware(app.wsgi_app, {
58 '/metrics': make_wsgi_app()
59})
60
61if __name__ == '__main__':
62 from feedweb_utils import did_doc
63 app.add_url_rule('/.well-known/did.json', view_func=did_doc)
64
65 app.run(debug=True)