リビジョン | 0917135ab97d1ad31edac3a5e4097c2ef0de696d (tree) |
---|---|
日時 | 2019-02-07 02:39:59 |
作者 | Dan Villiom Podlaski Christiansen <dan@mage...> |
コミッター | Dan Villiom Podlaski Christiansen |
initial commit
@@ -0,0 +1,4 @@ | ||
1 | +syntax: glob | |
2 | + | |
3 | +.venv | |
4 | +.\#* |
@@ -0,0 +1,21 @@ | ||
1 | +# -*- toml -*- | |
2 | + | |
3 | +[[source]] | |
4 | +name = "pypi" | |
5 | +url = "https://pypi.org/simple" | |
6 | +verify_ssl = true | |
7 | + | |
8 | +[scripts] | |
9 | +me = "python ./menu.py" | |
10 | +pydoc = "python -m pydoc" | |
11 | + | |
12 | +[dev-packages] | |
13 | + | |
14 | +[packages] | |
15 | +pytesseract = "*" | |
16 | +pdf2image = "*" | |
17 | +click = "*" | |
18 | +pyquery = "*" | |
19 | + | |
20 | +[requires] | |
21 | +python_version = "3.7" |
@@ -0,0 +1,124 @@ | ||
1 | +{ | |
2 | + "_meta": { | |
3 | + "hash": { | |
4 | + "sha256": "3810c30b16d3c2b53b160f7c74cd1f426e5fd6f4a29d4616ab78b7a3d098143c" | |
5 | + }, | |
6 | + "pipfile-spec": 6, | |
7 | + "requires": { | |
8 | + "python_version": "3.7" | |
9 | + }, | |
10 | + "sources": [ | |
11 | + { | |
12 | + "name": "pypi", | |
13 | + "url": "https://pypi.org/simple", | |
14 | + "verify_ssl": true | |
15 | + } | |
16 | + ] | |
17 | + }, | |
18 | + "default": { | |
19 | + "click": { | |
20 | + "hashes": [ | |
21 | + "sha256:2335065e6395b9e67ca716de5f7526736bfa6ceead690adf616d925bdc622b13", | |
22 | + "sha256:5b94b49521f6456670fdb30cd82a4eca9412788a93fa6dd6df72c94d5a8ff2d7" | |
23 | + ], | |
24 | + "index": "pypi", | |
25 | + "version": "==7.0" | |
26 | + }, | |
27 | + "cssselect": { | |
28 | + "hashes": [ | |
29 | + "sha256:066d8bc5229af09617e24b3ca4d52f1f9092d9e061931f4184cd572885c23204", | |
30 | + "sha256:3b5103e8789da9e936a68d993b70df732d06b8bb9a337a05ed4eb52c17ef7206" | |
31 | + ], | |
32 | + "version": "==1.0.3" | |
33 | + }, | |
34 | + "lxml": { | |
35 | + "hashes": [ | |
36 | + "sha256:0dd6589fa75d369ba06d2b5f38dae107f76ea127f212f6a7bee134f6df2d1d21", | |
37 | + "sha256:1afbac344aa68c29e81ab56c1a9411c3663157b5aee5065b7fa030b398d4f7e0", | |
38 | + "sha256:1baad9d073692421ad5dbbd81430aba6c7f5fdc347f03537ae046ddf2c9b2297", | |
39 | + "sha256:1d8736421a2358becd3edf20260e41a06a0bf08a560480d3a5734a6bcbacf591", | |
40 | + "sha256:1e1d9bddc5afaddf0de76246d3f2152f961697ad7439c559f179002682c45801", | |
41 | + "sha256:1f179dc8b2643715f020f4d119d5529b02cd794c1c8f305868b73b8674d2a03f", | |
42 | + "sha256:241fb7bdf97cb1df1edfa8f0bcdfd80525d4023dac4523a241907c8b2f44e541", | |
43 | + "sha256:2f9765ee5acd3dbdcdc0d0c79309e01f7c16bc8d39b49250bf88de7b46daaf58", | |
44 | + "sha256:312e1e1b1c3ce0c67e0b8105317323e12807955e8186872affb667dbd67971f6", | |
45 | + "sha256:3273db1a8055ca70257fd3691c6d2c216544e1a70b673543e15cc077d8e9c730", | |
46 | + "sha256:34dfaa8c02891f9a246b17a732ca3e99c5e42802416628e740a5d1cb2f50ff49", | |
47 | + "sha256:3aa3f5288af349a0f3a96448ebf2e57e17332d99f4f30b02093b7948bd9f94cc", | |
48 | + "sha256:51102e160b9d83c1cc435162d90b8e3c8c93b28d18d87b60c56522d332d26879", | |
49 | + "sha256:56115fc2e2a4140e8994eb9585119a1ae9223b506826089a3ba753a62bd194a6", | |
50 | + "sha256:69d83de14dbe8fe51dccfd36f88bf0b40f5debeac763edf9f8325180190eba6e", | |
51 | + "sha256:99fdce94aeaa3ccbdfcb1e23b34273605c5853aa92ec23d84c84765178662c6c", | |
52 | + "sha256:a7c0cd5b8a20f3093ee4a67374ccb3b8a126743b15a4d759e2a1bf098faac2b2", | |
53 | + "sha256:abe12886554634ed95416a46701a917784cb2b4c77bfacac6916681d49bbf83d", | |
54 | + "sha256:b4f67b5183bd5f9bafaeb76ad119e977ba570d2b0e61202f534ac9b5c33b4485", | |
55 | + "sha256:bdd7c1658475cc1b867b36d5c4ed4bc316be8d3368abe03d348ba906a1f83b0e", | |
56 | + "sha256:c6f24149a19f611a415a51b9bc5f17b6c2f698e0d6b41ffb3fa9f24d35d05d73", | |
57 | + "sha256:d1e111b3ab98613115a208c1017f266478b0ab224a67bc8eac670fa0bad7d488", | |
58 | + "sha256:d6520aa965773bbab6cb7a791d5895b00d02cf9adc93ac2bf4edb9ac1a6addc5", | |
59 | + "sha256:dd185cde2ccad7b649593b0cda72021bc8a91667417001dbaf24cd746ecb7c11", | |
60 | + "sha256:de2e5b0828a9d285f909b5d2e9d43f1cf6cf21fe65bc7660bdaa1780c7b58298", | |
61 | + "sha256:f726444b8e909c4f41b4fde416e1071cf28fa84634bfb4befdf400933b6463af" | |
62 | + ], | |
63 | + "version": "==4.3.0" | |
64 | + }, | |
65 | + "pdf2image": { | |
66 | + "hashes": [ | |
67 | + "sha256:c417149cb5ca52021203943e0eeb95db53580afebe728086e69671add4daeb08" | |
68 | + ], | |
69 | + "index": "pypi", | |
70 | + "version": "==1.4.1" | |
71 | + }, | |
72 | + "pillow": { | |
73 | + "hashes": [ | |
74 | + "sha256:051de330a06c99d6f84bcf582960487835bcae3fc99365185dc2d4f65a390c0e", | |
75 | + "sha256:0ae5289948c5e0a16574750021bd8be921c27d4e3527800dc9c2c1d2abc81bf7", | |
76 | + "sha256:0b1efce03619cdbf8bcc61cfae81fcda59249a469f31c6735ea59badd4a6f58a", | |
77 | + "sha256:163136e09bd1d6c6c6026b0a662976e86c58b932b964f255ff384ecc8c3cefa3", | |
78 | + "sha256:18e912a6ccddf28defa196bd2021fe33600cbe5da1aa2f2e2c6df15f720b73d1", | |
79 | + "sha256:24ec3dea52339a610d34401d2d53d0fb3c7fd08e34b20c95d2ad3973193591f1", | |
80 | + "sha256:267f8e4c0a1d7e36e97c6a604f5b03ef58e2b81c1becb4fccecddcb37e063cc7", | |
81 | + "sha256:3273a28734175feebbe4d0a4cde04d4ed20f620b9b506d26f44379d3c72304e1", | |
82 | + "sha256:4c678e23006798fc8b6f4cef2eaad267d53ff4c1779bd1af8725cc11b72a63f3", | |
83 | + "sha256:4d4bc2e6bb6861103ea4655d6b6f67af8e5336e7216e20fff3e18ffa95d7a055", | |
84 | + "sha256:505738076350a337c1740a31646e1de09a164c62c07db3b996abdc0f9d2e50cf", | |
85 | + "sha256:5233664eadfa342c639b9b9977190d64ad7aca4edc51a966394d7e08e7f38a9f", | |
86 | + "sha256:5d95cb9f6cced2628f3e4de7e795e98b2659dfcc7176ab4a01a8b48c2c2f488f", | |
87 | + "sha256:7eda4c737637af74bac4b23aa82ea6fbb19002552be85f0b89bc27e3a762d239", | |
88 | + "sha256:801ddaa69659b36abf4694fed5aa9f61d1ecf2daaa6c92541bbbbb775d97b9fe", | |
89 | + "sha256:825aa6d222ce2c2b90d34a0ea31914e141a85edefc07e17342f1d2fdf121c07c", | |
90 | + "sha256:9c215442ff8249d41ff58700e91ef61d74f47dfd431a50253e1a1ca9436b0697", | |
91 | + "sha256:a3d90022f2202bbb14da991f26ca7a30b7e4c62bf0f8bf9825603b22d7e87494", | |
92 | + "sha256:a631fd36a9823638fe700d9225f9698fb59d049c942d322d4c09544dc2115356", | |
93 | + "sha256:a6523a23a205be0fe664b6b8747a5c86d55da960d9586db039eec9f5c269c0e6", | |
94 | + "sha256:a756ecf9f4b9b3ed49a680a649af45a8767ad038de39e6c030919c2f443eb000", | |
95 | + "sha256:b117287a5bdc81f1bac891187275ec7e829e961b8032c9e5ff38b70fd036c78f", | |
96 | + "sha256:ba04f57d1715ca5ff74bb7f8a818bf929a204b3b3c2c2826d1e1cc3b1c13398c", | |
97 | + "sha256:cd878195166723f30865e05d87cbaf9421614501a4bd48792c5ed28f90fd36ca", | |
98 | + "sha256:cee815cc62d136e96cf76771b9d3eb58e0777ec18ea50de5cfcede8a7c429aa8", | |
99 | + "sha256:d1722b7aa4b40cf93ac3c80d3edd48bf93b9208241d166a14ad8e7a20ee1d4f3", | |
100 | + "sha256:d7c1c06246b05529f9984435fc4fa5a545ea26606e7f450bdbe00c153f5aeaad", | |
101 | + "sha256:e9c8066249c040efdda84793a2a669076f92a301ceabe69202446abb4c5c5ef9", | |
102 | + "sha256:f227d7e574d050ff3996049e086e1f18c7bd2d067ef24131e50a1d3fe5831fbc", | |
103 | + "sha256:fc9a12aad714af36cf3ad0275a96a733526571e52710319855628f476dcb144e" | |
104 | + ], | |
105 | + "version": "==5.4.1" | |
106 | + }, | |
107 | + "pyquery": { | |
108 | + "hashes": [ | |
109 | + "sha256:07987c2ed2aed5cba29ff18af95e56e9eb04a2249f42ce47bddfb37f487229a3", | |
110 | + "sha256:4771db76bd14352eba006463656aef990a0147a0eeaf094725097acfa90442bf" | |
111 | + ], | |
112 | + "index": "pypi", | |
113 | + "version": "==1.4.0" | |
114 | + }, | |
115 | + "pytesseract": { | |
116 | + "hashes": [ | |
117 | + "sha256:11c20321595b6e2e904b594633edf1a717212b13bac7512986a2d807b8849770" | |
118 | + ], | |
119 | + "index": "pypi", | |
120 | + "version": "==0.2.6" | |
121 | + } | |
122 | + }, | |
123 | + "develop": {} | |
124 | +} |
@@ -0,0 +1,56 @@ | ||
1 | +#!/usr/bin/env python3.7 | |
2 | + | |
3 | +import locale | |
4 | +import re | |
5 | +import time | |
6 | +import urllib | |
7 | + | |
8 | +import click | |
9 | +import pdf2image | |
10 | +import pyquery | |
11 | +import pytesseract | |
12 | + | |
13 | +DEFAULT_URL = 'http://www.firma-catering.dk/frokostordning/ugens-menu' | |
14 | + | |
15 | + | |
16 | +@click.command() | |
17 | +@click.argument('url', default=DEFAULT_URL) | |
18 | +def main(url): | |
19 | + locale.setlocale(locale.LC_ALL, 'da_DK.UTF-8') | |
20 | + | |
21 | + weeknum = str(int(time.strftime('%V'))) | |
22 | + weekday = time.strftime('%A') | |
23 | + date = time.strftime('%e %b').strip().lower() | |
24 | + | |
25 | + doc = pyquery.PyQuery(url=url) | |
26 | + | |
27 | + for el in doc.find('a[title]'): | |
28 | + expected = f'Uge {weeknum}' | |
29 | + title = el.get('title') | |
30 | + | |
31 | + if title == expected: | |
32 | + url = el.get('href') | |
33 | + break | |
34 | + else: | |
35 | + raise click.ClickException('Not found!') | |
36 | + | |
37 | + with urllib.request.urlopen(url) as fp: | |
38 | + image, = pdf2image.convert_from_bytes(fp.read()) | |
39 | + | |
40 | + text = pytesseract.image_to_string(image, | |
41 | + lang='dan', | |
42 | + config='--psm 6') | |
43 | + | |
44 | + click.echo(f'Dagens [menu]({url}) i Århus:\n') | |
45 | + | |
46 | + for line in text.splitlines(): | |
47 | + if line.startswith(weekday): | |
48 | + line = line[len(weekday):].strip() | |
49 | + | |
50 | + if line.startswith(date): | |
51 | + line = line[len(date):].strip() | |
52 | + | |
53 | + click.echo(line) | |
54 | + | |
55 | +if __name__ == '__main__': | |
56 | + main() |
@@ -0,0 +1,10 @@ | ||
1 | +#!/bin/sh -e | |
2 | + | |
3 | +cd $(dirname $0) | |
4 | + | |
5 | +if ! test -d .venv | |
6 | +then | |
7 | + PIPENV_VENV_IN_PROJECT=1 pipenv sync | |
8 | +fi | |
9 | + | |
10 | +exec pipenv run me "$@" |