-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbuddy.py
66 lines (53 loc) · 1.91 KB
/
buddy.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
from flask import Flask, request
from signedbam import signedbam
from threading import Lock
import requests
import dateutil.parser
app = Flask(__name__)
class URLHandler:
def __init__(self):
self.cache = {}
self.lock = Lock()
def get_uuid_url(self, uuid):
from urllib.parse import urlparse, parse_qs
with self.lock:
if uuid in self.cache:
bam, bai = self.cache[uuid]
# print(parse_qs(urlparse(bai).query))
time_expires = min(
int(dateutil.parser.isoparse(parse_qs(urlparse(bai).query)['x-goog-date'][0]).timestamp()),
int(dateutil.parser.isoparse(parse_qs(urlparse(bam).query)['x-goog-date'][0]).timestamp())
)
from time import time
if time_expires - time() > 5 * 60:
return bam, bai
bam, bai = signedbam(uuid)
self.cache[uuid] = bam, bai
return bam, bai
def get_bam(self, uuid):
bam, bai = self.get_uuid_url(uuid)
return bam
def get_bai(self, uuid):
bam, bai = self.get_uuid_url(uuid)
return bai
handler = URLHandler()
@app.route("/<uuid>.bam")
def bam(uuid):
bam_url = handler.get_bam(uuid)
range_header = request.headers.get("Range", None)
if range_header is not None:
res = requests.get(bam_url, headers={"Range": range_header})
else:
res = requests.get(bam_url)
return (res.content, res.status_code, res.headers.items())
@app.route("/<uuid>.bai")
def bai(uuid):
bai_url = handler.get_bai(uuid)
range_header = request.headers.get("Range", None)
if range_header is not None:
res = requests.get(bai_url, headers={"Range": range_header})
else:
res = requests.get(bai_url)
return (res.content, res.status_code, res.headers.items())
if __name__ == "__main__":
app.run(threaded=True)