Tobias Simetsreiter пре 5 година
родитељ
комит
0375662daa
1 измењених фајлова са 97 додато и 0 уклоњено
  1. 97 0
      ttsselfhoster.py

+ 97 - 0
ttsselfhoster.py

@@ -0,0 +1,97 @@
+#!/usr/bin/env python3
+
+def main():
+    import os
+    import json
+    import re
+    import sys
+    p = parser()
+    args = p.parse_args()
+    with open(args.input_file) as fd:
+        js = json.load(fd)
+    jsgen = dict_generator(js)
+    url_regex = re.compile("^https?://")
+    for it in jsgen:
+        val = it[-1]
+        if type(val)==str and url_regex.match(val):
+            print(it, file=sys.stderr)
+            if args.server_dir:
+                sha, cachefile = cache_file(val, args.server_dir)
+                print(cachefile, file=sys.stderr)
+            if args.url:
+                newurl = args.url + "/blocks/" + sha
+                dict_set(js, it[:-1], newurl)
+    if args.output_file == "-":
+        json.dump(js, sys.stdout)
+    else:
+        with open(args.output_file, "w") as fd:
+            json.dump(js, sys.stdout)
+
+
+def parser():
+    import argparse
+    p = argparse.ArgumentParser()
+    p.add_argument("-f","--input_file", required=True)
+    p.add_argument("-o","--output_file", default="-")
+    p.add_argument("-s","--server_dir", default=None)
+    p.add_argument("-u","--url", default=None)
+    return p
+
+def dict_set(dic , path, val):
+    iter_dic = dic
+    for p in path:
+        last_dic = iter_dic
+        iter_dic = iter_dic[p]
+    last_dic[p] = val
+
+
+def cache_file(url, cache_dir):
+    from urllib.request import urlopen
+    import os
+    import uuid
+    import hashlib
+    blocks_dir = os.path.join(cache_dir,"blocks")
+    sha_url = hashlib.sha512()
+    sha_url.update(url.encode())
+    sha_url = sha_url.hexdigest()
+
+    if not os.path.isdir(blocks_dir):
+        os.makedirs(blocks_dir)
+    cachefile = os.path.join(blocks_dir, sha_url)
+    mode = "wb"
+    # if os.path.isfile(cachefile):
+    #     mode = "rb"
+    BS=2**20
+    sha_req = hashlib.sha512()
+    sha_cache = hashlib.sha512()
+    with urlopen(url) as req:
+        with open(cachefile,mode) as fd:
+            BUF = True
+            while BUF:
+                BUF = req.read()
+                fd.write(BUF)
+                sha_req.update(BUF)
+
+
+    return (sha_url, cachefile)
+
+def dict_generator(indict, pre=None):
+    pre = pre[:] if pre else []
+    if isinstance(indict, dict):
+        for key, value in indict.items():
+            if isinstance(value, dict):
+                for d in dict_generator(value, pre + [key]):
+                    yield d
+            elif isinstance(value, list) or isinstance(value, tuple):
+                i = 0
+                for v in value:
+                    for d in dict_generator(v, pre + [key,i]):
+                        yield d
+                    i += 1
+            else:
+                yield pre + [key, value]
+    else:
+        yield pre + [indict]
+
+if __name__ == "__main__":
+    main()