· 6 years ago · Nov 05, 2019, 12:24 AM
1import argparse
2import uuid
3import requests
4import json
5import os
6import sys
7import subprocess
8import time
9import multiprocessing as mp
10
11
12def construct_outfile(source):
13 return "".join(source.split(".")[:-1]) + "-{side}-out.ogg"
14
15
16def make_call(in_file, out_a_file, out_b_file, key):
17 n = 4
18 m = 5
19 retry = True
20 i = 0
21 while retry:
22 call_id = uuid.uuid4()
23 try:
24 r = requests.get("https://api.contest.com/voip{auth_token}/getConnection".format(auth_token=key),
25 params={"call": call_id}, timeout=1)
26 except:
27 continue
28 time.sleep(3)
29
30 config = r.json()
31 if not config["ok"]:
32 i += 1
33 continue
34 conf_file = "config-{}.json".format(call_id)
35 with open(conf_file, "w") as f1:
36 f1.write(json.dumps(config["result"]["config"]))
37 res = {"returncode": 0}
38 k = 0
39 while retry and k < m:
40 print("!!!!!!!!!!!!!!!!! 1-st call !!!!!!!!!!!!!!!!!")
41 os.system(
42 "./tgvoipcall {ip}:{port} {caller_tag} -k {key} -i {in_file} -o {out_b_file} -c {config_file} -r caller &".
43 format(
44 ip=config["result"]["endpoints"][0]["ip"],
45 port=config["result"]["endpoints"][0]["port"],
46 caller_tag=config["result"]["endpoints"][0]["peer_tags"]["caller"],
47 key=config["result"]["encryption_key"],
48 in_file=in_file,
49 out_b_file=out_b_file,
50 config_file=conf_file
51 ))
52 time.sleep(0.5)
53 print("!!!!!!!!!!!!!!!!! 2-nd call !!!!!!!!!!!!!!!!!")
54 res = subprocess.run(
55 "./tgvoipcall {ip}:{port} {callee_tag} -k {key} -i {in_file} -o {out_a_file} -c {config_file} -r callee".
56 format(
57 ip=config["result"]["endpoints"][0]["ip"],
58 port=config["result"]["endpoints"][0]["port"],
59 callee_tag=config["result"]["endpoints"][0]["peer_tags"]["callee"],
60 key=config["result"]["encryption_key"],
61 in_file=in_file,
62 out_a_file=out_a_file,
63 config_file=conf_file
64 ).split())
65 k += 1
66 retry = (res.returncode != 0)
67 i += 1
68 if i > n:
69 retry = False
70 print("!!!!!!!!!!!!!!!!! Faild after {} retry !!!!!!!!!!!!!!!!!".format(n))
71 if retry:
72 print("!!!!!!!!!!!!!!!!! RETRY {} !!!!!!!!!!!!!!!!!".format(i+k))
73 return call_id, config
74
75
76if __name__ == "__main__":
77 parser = argparse.ArgumentParser(description="Run all TG Contest programs with all samples and check call results")
78 parser.add_argument("-k", "--api-key", help="TG contest API key", required=True)
79 parser.add_argument("-c", "--call-id", help="TG session call id")
80 parser.add_argument("-S", "--samples-dir", help="TG samples directory, defaults to .")
81 parser.add_argument("-O", "--output-dir", help="Directory for saving output files, directory will be created," +
82 " defaults to SAMPLES_DIR")
83 parser.add_argument("-s", "--sample", help="Sample file name to play in call, must be used in conjunction with -o")
84 parser.add_argument("-o", "--output", help="Sample output file mask, must be used in conjunction with -s")
85
86 args = parser.parse_args()
87
88 source = False
89 source_dir = False
90 output_dir = ""
91 if args.samples_dir:
92 source_dir = args.samples_dir
93 if args.output_dir:
94 output_dir = args.output_dir
95 try:
96 os.mkdir(output_dir)
97 except FileExistsError:
98 pass
99 else:
100 output_dir = source_dir
101 elif args.sample:
102 source = args.sample
103 if args.output:
104 output = args.output
105 else:
106 output = construct_outfile(source)
107 if not source and not source_dir:
108 source_dir = "."
109
110 key = args.api_key
111
112 if not source_dir:
113 # noinspection PyUnboundLocalVariable
114 call_id, config = make_call(source, output.format(side="a"), output.format(side="b"), key)
115 sys.exit(0)
116
117 mp.set_start_method("fork")
118 procs = []
119
120 def mp_target(source, output, key, f):
121 call_id, config = make_call(source, output.format(side="a"), output.format(side="b"), key)
122 print("=!!============= RESULTS ==============")
123 print("=!!= Call id: {}".format(call_id))
124 print("=!!= Sample: {}/{}".format(source_dir, f))
125 with open("config-full-{}.json".format(call_id), "w") as f2:
126 f2.write(json.dumps(config, sort_keys=True, indent=2))
127 print("=!!============= END RESULTS ==============")
128
129 for f in os.listdir(source_dir):
130 if not (f.find(".ogg") >= 0 and f.find("-out.ogg") == -1):
131 continue
132
133 source = "{}/{}".format(source_dir, f)
134 output = "{}/{}".format(output_dir, construct_outfile(f))
135 procs.append(mp.Process(target=mp_target, args=(source, output, key, f)))
136 procs[-1].start()
137
138 for p in procs:
139 p.join()