| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
|
|
| import argparse |
| import re |
|
|
| import requests |
| from lxml.html import soupparser |
|
|
| MAX_REQUEST_TRIALS = 10 |
|
|
|
|
| def parse_args(): |
| parser = argparse.ArgumentParser() |
| parser.add_argument("--lib_path", required=True) |
| args = parser.parse_args() |
| return args |
|
|
|
|
| def request_trial(func, *args, **kwargs): |
| for i in range(MAX_REQUEST_TRIALS): |
| try: |
| response = func(*args, **kwargs) |
| except: |
| continue |
| else: |
| return response |
|
|
| raise SystemError |
|
|
|
|
| def main(): |
| args = parse_args() |
|
|
| |
| |
| |
|
|
| with open(args.lib_path + ".h", "w") as f: |
| f.write("#include <vector>\n") |
| f.write("#include <string>\n") |
| f.write("#include <unordered_map>\n\n") |
| f.write("// { make1 : ({ model1 : sensor-width in mm }, ...), ... }\n") |
| f.write( |
| "typedef std::vector<std::pair<std::string, float>> make_specs_t;\n" |
| ) |
| f.write( |
| "typedef std::unordered_map<std::string, make_specs_t> camera_specs_t;;\n\n" |
| ) |
| f.write("camera_specs_t InitializeCameraSpecs();\n\n") |
|
|
| |
| |
| |
|
|
| makes_response = requests.get("http://www.digicamdb.com") |
| makes_tree = soupparser.fromstring(makes_response.text) |
| makes_node = makes_tree.find('.//select[@id="select_brand"]') |
| makes = [b.attrib["value"] for b in makes_node.iter("option")] |
|
|
| with open(args.lib_path + ".cc", "w") as f: |
| f.write("camera_specs_t InitializeCameraSpecs() {\n") |
| f.write(" camera_specs_t specs;\n\n") |
| for make in makes: |
| f.write(" {\n") |
| f.write( |
| ' auto& make_specs = specs["%s"];\n' |
| % make.lower().replace(" ", "") |
| ) |
|
|
| models_response = request_trial( |
| requests.post, |
| "http://www.digicamdb.com/inc/ajax.php", |
| data={"b": make, "role": "header_search"}, |
| ) |
|
|
| models_tree = soupparser.fromstring(models_response.text) |
| models_code = "" |
| num_models = 0 |
| for model_node in models_tree.iter("option"): |
| model = model_node.attrib.get("value") |
| model_name = model_node.text |
| if model is None: |
| continue |
|
|
| url = "http://www.digicamdb.com/specs/{0}_{1}".format( |
| make, model |
| ) |
| specs_response = request_trial(requests.get, url) |
|
|
| specs_tree = soupparser.fromstring(specs_response.text) |
| for spec in specs_tree.findall('.//td[@class="info_key"]'): |
| if spec.text.strip() == "Sensor:": |
| sensor_text = spec.find("..").find( |
| './td[@class="bold"]' |
| ) |
| sensor_text = sensor_text.text.strip() |
| m = re.match(".*?([\d.]+) x ([\d.]+).*?", sensor_text) |
| sensor_width = m.group(1) |
| data = ( |
| model_name.lower().replace(" ", ""), |
| float(sensor_width.replace(" ", "")), |
| ) |
| models_code += ( |
| ' make_specs.emplace_back("%s", %.4ff);\n' % data |
| ) |
|
|
| print(make, model_name) |
| print(" ", sensor_text) |
|
|
| num_models += 1 |
|
|
| f.write(" make_specs.reserve(%d);\n" % num_models) |
| f.write(models_code) |
| f.write(" }\n\n") |
|
|
| f.write(" return specs;\n") |
| f.write("}\n") |
|
|
|
|
| if __name__ == "__main__": |
| main() |
|
|