|
@@ -0,0 +1,40 @@
|
|
|
+import csv
|
|
|
+import colorsys
|
|
|
+import random
|
|
|
+from argparse import ArgumentParser
|
|
|
+
|
|
|
+parser = ArgumentParser()
|
|
|
+parser.add_argument("color", nargs="?", default=None)
|
|
|
+parser.add_argument("-n", "--number", default=1, type=int)
|
|
|
+parser.add_argument("--database", nargs=1, default="database.csv")
|
|
|
+parser.add_argument("-v", "--verbose", action="store_true")
|
|
|
+args = parser.parse_args()
|
|
|
+
|
|
|
+if args.number <= 0:
|
|
|
+ raise ValueError("Must request a number greater than 0")
|
|
|
+
|
|
|
+if args.color is not None:
|
|
|
+ if len(args.color) != 6:
|
|
|
+ raise ValueError("Color must be a 6 digit hex")
|
|
|
+ color = (int(args.color[0:2], base=16), int(args.color[2:4], base=16), int(args.color[4:6], base=16))
|
|
|
+else:
|
|
|
+ # TODO random color
|
|
|
+ color = tuple(int(c * 255) for c in colorsys.hsv_to_rgb(random.random(), 0.5, 0.9))
|
|
|
+ print(f"Generated random color: {color}")
|
|
|
+
|
|
|
+results = []
|
|
|
+with open(args.database) as infile:
|
|
|
+ for name, x, *y in csv.reader(infile, delimiter=",", quotechar="'"):
|
|
|
+ score = float(x) - sum(float(y_c) * c for y_c, c in zip(y, color))
|
|
|
+ results.append((score, name))
|
|
|
+
|
|
|
+if args.number > 1:
|
|
|
+ for i, (score, name) in enumerate(sorted(results)[:args.number]):
|
|
|
+ print(f"{i+1}:\t{name}")
|
|
|
+ if args.verbose:
|
|
|
+ print(f"\t\t\t{score=}")
|
|
|
+else:
|
|
|
+ best_score, best_name = min(results)
|
|
|
+ print(f"Best match: {best_name}")
|
|
|
+ if args.verbose:
|
|
|
+ print(f"{score=}")
|