14 app = flask.Flask(__name__)
15 app.config['CORS_HEADERS'] = 'Content-Type'
18 TAG_PREFIX = os.getenv('NMBPREFIX', 'notmuch::')
22 @app.route('/tags', methods=['GET'])
25 database = notmuch.Database(path=NOTMUCH_PATH)
27 for t in database.get_all_tags():
28 if t.startswith(TAG_PREFIX):
29 tags.add(t[len(TAG_PREFIX):])
32 return flask.Response(
33 response=json.dumps(sorted(tags)),
34 mimetype='application/json')
37 def _message_tags(message):
39 tag[len(TAG_PREFIX):] for tag in message.get_tags()
40 if tag.startswith(TAG_PREFIX))
43 @app.route('/mid/<message_id>', methods=['GET', 'POST'])
44 def message_id_tags(message_id):
45 if flask.request.method == 'POST':
46 database = notmuch.Database(
48 mode=notmuch.Database.MODE.READ_WRITE)
50 message = database.find_message(message_id)
52 return flask.Response(status=404)
53 database.begin_atomic()
55 for change in flask.request.get_json():
56 if change.startswith('+'):
57 message.add_tag(TAG_PREFIX + change[1:])
58 elif change.startswith('-'):
59 message.remove_tag(TAG_PREFIX + change[1:])
61 return flask.Response(status=400)
64 tags = _message_tags(message=message)
67 elif flask.request.method == 'GET':
68 database = notmuch.Database(path=NOTMUCH_PATH)
70 message = database.find_message(message_id)
72 return flask.Response(status=404)
73 tags = _message_tags(message=message)
76 return flask.Response(
77 response=json.dumps(tags),
78 mimetype='application/json')
81 @app.route('/gmane/<group>/<int:article>', methods=['GET'])
82 def gmane_message_id(group, article):
83 url = 'http://download.gmane.org/{}/{}/{}'.format(
84 group, article, article + 1)
85 response = urllib.request.urlopen(url=url, timeout=3)
86 mbox_bytes = response.read()
87 with tempfile.NamedTemporaryFile(prefix='nmbug-', suffix='.mbox') as f:
89 mbox = mailbox.mbox(path=f.name)
90 _, message = mbox.popitem()
91 message_id = message['message-id']
92 return flask.Response(
93 response=message_id.lstrip('<').rstrip('>'),
94 mimetype='text/plain')
97 if __name__ == '__main__':
98 app.run(host='0.0.0.0')