aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGabriel Pérez-Cerezo <gabriel@gpcf.eu>2017-10-04 00:42:18 +0200
committerGabriel Pérez-Cerezo <gabriel@gpcf.eu>2017-10-04 00:42:18 +0200
commit2195b639091842492ea11ab8b91a631c59a7d32f (patch)
tree89188abfb8f129056c3ec45e8e76a501df694e43
parent588a1df9f0ae350c3593156ebb102835a4124115 (diff)
downloadmensa-2195b639091842492ea11ab8b91a631c59a7d32f.tar.gz
mensa-2195b639091842492ea11ab8b91a631c59a7d32f.tar.bz2
mensa-2195b639091842492ea11ab8b91a631c59a7d32f.zip
Modularized program
-rw-r--r--backends/mathemensa.py44
-rw-r--r--backends/mathemensa.yapsy-plugin3
-rw-r--r--backends/satyam.py38
-rw-r--r--backends/satyam.yapsy-plugin3
-rw-r--r--backends/singh.py54
-rw-r--r--backends/singh.yapsy-plugin3
-rw-r--r--backends/studentenwerk.py72
-rw-r--r--backends/studentenwerk.yapsy-plugin3
-rw-r--r--common.py33
-rw-r--r--mathemensa.py41
-rw-r--r--mensa.py58
-rwxr-xr-xrun.py16
-rw-r--r--satyam.py34
-rw-r--r--singh.py51
14 files changed, 236 insertions, 217 deletions
diff --git a/backends/mathemensa.py b/backends/mathemensa.py
new file mode 100644
index 0000000..b98ab1d
--- /dev/null
+++ b/backends/mathemensa.py
@@ -0,0 +1,44 @@
+# -*- coding: utf-8 -*-
+
+import urllib.request, urllib.error, urllib.parse
+from lxml import etree
+from lxml.cssselect import CSSSelector
+import re
+
+import xml.sax.saxutils as saxutils
+import html5lib
+import datetime
+from base import *
+from yapsy.IPlugin import IPlugin
+
+class Mathemensa(IPlugin) :
+ def register_restaurants(self) :
+ r = Restaurant("Mathemensa", "Mathemensa", self, "dummy")
+ register_restaurant(r)
+
+ def get_food_items(self) :
+ weekday = datetime.datetime.today().weekday()
+ if weekday > 4 :
+ print("Error: No food today")
+ return ""
+ user_agent = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64)'
+ headers = {'User-Agent': user_agent}
+
+ req = urllib.request.Request('http://personalkantine.personalabteilung.tu-berlin.de/', headers=headers)
+ response = urllib.request.urlopen(req)
+ the_page = response.read()
+ document = html5lib.parse(the_page, treebuilder="lxml")
+ sel = CSSSelector('.Menu__accordion')
+ fl = []
+ for k in sel(document)[0][weekday] :
+ if k.tag.endswith("ul") :
+ for j in k :
+ price = j[1].text
+ st = str(etree.tostring(j)).split("\\n")[2].split("<")[0]
+ name = j[0].text + ", " + etree.fromstring("<p>%s</p>"%st).text.strip() # really extremely dirty hack
+ veg = 0
+
+ if "(v)" in name or "Gemüseplatte" in name :
+ veg = 1
+ fl.append(Food(name, price, "Menü", veg))
+ return fl
diff --git a/backends/mathemensa.yapsy-plugin b/backends/mathemensa.yapsy-plugin
new file mode 100644
index 0000000..d122795
--- /dev/null
+++ b/backends/mathemensa.yapsy-plugin
@@ -0,0 +1,3 @@
+[Core]
+Name = Mathemensa
+Module = mathemensa \ No newline at end of file
diff --git a/backends/satyam.py b/backends/satyam.py
new file mode 100644
index 0000000..a20d6bb
--- /dev/null
+++ b/backends/satyam.py
@@ -0,0 +1,38 @@
+import urllib.request, urllib.error, urllib.parse
+from lxml import etree
+from lxml.cssselect import CSSSelector
+import html5lib
+from base import *
+import re
+import sys
+from yapsy.IPlugin import IPlugin
+
+class Satyam(IPlugin):
+ def register_restaurants(self) :
+ r = Restaurant("Satyam", "Satyam", self, "dummy")
+ register_restaurant(r)
+ def get_food_items(self) :
+ s = sys.stderr
+ sys.stderr = open("/dev/null", "w")
+ user_agent = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64)'
+ headers = {'User-Agent': user_agent}
+
+ req = urllib.request.Request('http://www.mysatyam.de/angebote/express-mittagstisch.html', headers=headers)
+ response = urllib.request.urlopen(req)
+ the_page = response.read()
+ document = html5lib.parse(the_page, treebuilder="lxml")
+ groupsel = CSSSelector('.news-latest-item-content')
+ k = etree.tostring(groupsel(document)[0])
+ name = re.sub(r'<.+?>', ' ', str(k))
+ name = etree.fromstring("<p>%s</p>"%name).text.strip()
+ name = name.replace("\\n", "")
+ name = " ".join(name.split())
+
+ name = name.replace("5,95 €", "")
+ sys.stderr = s
+ return [Food("Mittagstisch Express", "5,95 €", "Mittagstisch", 2, name[3:-1])]
+
+
+# if __name__ == "__main__":
+# food = get_food_items()
+# print(formt(food))
diff --git a/backends/satyam.yapsy-plugin b/backends/satyam.yapsy-plugin
new file mode 100644
index 0000000..59207ad
--- /dev/null
+++ b/backends/satyam.yapsy-plugin
@@ -0,0 +1,3 @@
+[Core]
+Name = Satyam
+Module = satyam \ No newline at end of file
diff --git a/backends/singh.py b/backends/singh.py
new file mode 100644
index 0000000..a3b3119
--- /dev/null
+++ b/backends/singh.py
@@ -0,0 +1,54 @@
+import urllib.request, urllib.error, urllib.parse
+from lxml import etree
+from lxml.cssselect import CSSSelector
+import html5lib
+import re
+import sys
+import datetime
+from base import *
+from yapsy.IPlugin import IPlugin
+
+class Signh(IPlugin) :
+ def register_restaurants(self) :
+ r = Restaurant("Singh", "Mathe-Café", self, "dummy")
+ register_restaurant(r)
+ def get_food_items(self) :
+ sys.stderr = open("/dev/null", "w")
+ weekday = datetime.datetime.today().weekday()
+ if weekday > 4 :
+ print("Error: No food today")
+ return ""
+ user_agent = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64)'
+ headers = {'User-Agent': user_agent}
+
+ req = urllib.request.Request('http://singh-catering.de/cafe/', headers=headers)
+ response = urllib.request.urlopen(req)
+ the_page = response.read()
+ document = html5lib.parse(the_page, treebuilder="lxml")
+ groupsel = CSSSelector('.menu-list__items')
+ myorder=[0,3,1,4,2]
+ mylist = [ groupsel(document)[i] for i in myorder]
+ i = mylist[weekday]
+ fl = []
+ nmsel = CSSSelector('.menu-list__item')
+ for k in nmsel(i):
+ veg = 0
+ titsel = CSSSelector('.item_title')
+ name = titsel(k)[0].text
+ dscsel = CSSSelector('.desc__content')
+ desc = dscsel(k)[0].text
+ prsel = CSSSelector('.menu-list__item-price')
+ price = prsel(k)[0].text
+ vegsel = CSSSelector('.menu-list__item-highlight-title')
+ if len(vegsel(k)) > 0 :
+ if "VEGETARISCH" in vegsel(k)[0].text :
+ veg = 1
+ elif "VEGAN" in vegsel(k)[0].text :
+ veg = 2
+ fl.append(Food(name, price, "Essen", veg, desc))
+ return fl
+
+if __name__ == "__main__":
+ food = get_food_items()
+ print(formt(food))
+
diff --git a/backends/singh.yapsy-plugin b/backends/singh.yapsy-plugin
new file mode 100644
index 0000000..7faf774
--- /dev/null
+++ b/backends/singh.yapsy-plugin
@@ -0,0 +1,3 @@
+[Core]
+Name = Mathe-Café
+Module = singh \ No newline at end of file
diff --git a/backends/studentenwerk.py b/backends/studentenwerk.py
new file mode 100644
index 0000000..ce6d2fd
--- /dev/null
+++ b/backends/studentenwerk.py
@@ -0,0 +1,72 @@
+# Copyright (C) 2017 Gabriel Perez-Cerezo <gabriel@gpcf.eu>
+# -*- coding: utf-8 -*-
+
+import urllib.request, urllib.error, urllib.parse
+from lxml import etree
+from lxml.cssselect import CSSSelector
+import html5lib
+from base import *
+from yapsy.IPlugin import IPlugin
+import multiprocessing
+
+
+from yapsy import NormalizePluginNameForModuleName as normalize
+
+mensenliste = {"TU Hardenberg" : "mensa-tu-hardenbergstra%C3%9Fe", "TU Marchstraße": "cafeteria-tu-marchstra%C3%9Fe", "TU Skyline": "cafeteria-tu-skyline", "TU Architektur": "cafeteria-tu-architektur", "TU Ackerstraße": "cafeteria-tu-ackerstra%C3%9Fe"}
+
+
+
+def pr_f(j) :
+ i,k = j
+ food = get_food_items(k, ignore_nudelauswahl=True)
+ return (i,"*"*20+i+"*"*20+"\n"+formt(food))
+
+class Studentenwerk(IPlugin) :
+ def register_restaurants (self) :
+ mensenliste = {"TU Hardenberg" : "mensa-tu-hardenbergstra%C3%9Fe", "TU Marchstraße": "cafeteria-tu-marchstra%C3%9Fe", "TU Skyline": "cafeteria-tu-skyline", "TU Architektur": "cafeteria-tu-architektur", "TU Ackerstraße": "cafeteria-tu-ackerstra%C3%9Fe"}
+ for h,n in mensenliste.items() :
+ r = Restaurant(normalize(h), h, self, "dummy", [n])
+ register_restaurant(r)
+ def get_food_items(self, mensa="mensa-tu-hardenbergstra%C3%9Fe", ignore_nudelauswahl=False) :
+ user_agent = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64)'
+ headers = {'User-Agent': user_agent}
+
+ req = urllib.request.Request('https://www.stw.berlin/mensen/%s.html' % mensa, headers=headers)
+ response = urllib.request.urlopen(req)
+ the_page = response.read()
+ document = html5lib.parse(the_page, treebuilder="lxml")
+ groupsel = CSSSelector('.splGroupWrapper')
+ groups = [e for e in groupsel(document)]
+ fl = []
+ for i in groups :
+ try:
+ name = CSSSelector('.splGroup')(i)[0].text
+ except:
+ raise NoMenuError from None
+ sel = CSSSelector('.splMeal')
+ meals = [e for e in sel(i)]
+ for m in meals :
+ namesel = CSSSelector('.bold')
+ nm = namesel(m)[0].text
+ if ignore_nudelauswahl and "Nudelauswahl" in nm:
+ continue
+ pricesel = CSSSelector('.col-md-3')
+ veg = 0
+ if len(pricesel(m)[0]) >= 2 :
+ if "15" in pricesel(m)[0][1].attrib["src"] :
+ veg = 2
+ elif "1.png" in pricesel(m)[0][1].attrib["src"] :
+ veg = 1
+ price = pricesel(m)[-1].text.strip()
+ fl.append(Food(nm, price, name, veg))
+ return fl
+
+
+
+# format:
+# if __name__ == "__main__":
+# pool = multiprocessing.Pool(4)
+# k = pool.map(pr_f, list(mensenliste.items()))
+# k.sort(key=lambda x: x[0])
+# for i in k :
+# print(i[1])
diff --git a/backends/studentenwerk.yapsy-plugin b/backends/studentenwerk.yapsy-plugin
new file mode 100644
index 0000000..ad2a994
--- /dev/null
+++ b/backends/studentenwerk.yapsy-plugin
@@ -0,0 +1,3 @@
+[Core]
+Name = Studentenwerk
+Module = studentenwerk \ No newline at end of file
diff --git a/common.py b/common.py
deleted file mode 100644
index 9b6cd43..0000000
--- a/common.py
+++ /dev/null
@@ -1,33 +0,0 @@
-# Common classes and methods.
-
-class Food :
- def __init__(self,name, price="", category="Essen", veggie=False, desc=None) :
- self.name = name
- self.price = price
- self.category = category
- self.veggie = veggie
- self.desc=desc
-
-def formt (food) :
- cat = []
- vegkeys = [ "", "Vegetarian", "Vegan" ]
- r = ""
- food.sort(key=lambda foo: foo.category)
- for i in food:
- if not i.category in cat :
- cat.append(i.category)
- if not i.category == None :
- r=r+ i.category+"\n"
- r=r+"\t" + i.name.ljust(80) + "\t"+ i.price.ljust(20) + vegkeys[i.veggie]+"\n"
- if i.desc :
- r = r+"\t "+i.desc+"\n"
- return r
-
-foodsources = {}
-
-class Foodsource :
- def __init__(self, name, function, args):
- pass
-
-def register_foodsource():
- pass
diff --git a/mathemensa.py b/mathemensa.py
deleted file mode 100644
index 9abfc75..0000000
--- a/mathemensa.py
+++ /dev/null
@@ -1,41 +0,0 @@
-# -*- coding: utf-8 -*-
-
-import urllib.request, urllib.error, urllib.parse
-from lxml import etree
-from lxml.cssselect import CSSSelector
-
-import xml.sax.saxutils as saxutils
-import html5lib
-import datetime
-from common import Food
-from common import formt
-
-def get_food_items() :
- weekday = datetime.datetime.today().weekday()
- if weekday > 4 :
- print("Error: No food today")
- return ""
- user_agent = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64)'
- headers = {'User-Agent': user_agent}
-
- req = urllib.request.Request('http://personalkantine.personalabteilung.tu-berlin.de/', headers=headers)
- response = urllib.request.urlopen(req)
- the_page = response.read()
- document = html5lib.parse(the_page, treebuilder="lxml")
- sel = CSSSelector('.Menu__accordion')
- fl = []
- for k in sel(document)[0][weekday] :
- if k.tag.endswith("ul") :
- for j in k :
- price = j[1].text
- st = str(etree.tostring(j)).split("\\n")[2].split("<")[0]
- name = j[0].text + ", " + etree.fromstring("<p>%s</p>"%st).text.strip() # really extremely dirty hack
- veg = 0
- if "(v)" in name or "Gemüseplatte" in name :
- veg = 1
- fl.append(Food(name, price, "Menü", veg))
- return fl
-
-if __name__ == "__main__":
- food = get_food_items()
- print(formt(food))
diff --git a/mensa.py b/mensa.py
deleted file mode 100644
index b37c5cd..0000000
--- a/mensa.py
+++ /dev/null
@@ -1,58 +0,0 @@
-# Copyright (C) 2017 Gabriel Perez-Cerezo <gabriel@gpcf.eu>
-# -*- coding: utf-8 -*-
-
-import urllib.request, urllib.error, urllib.parse
-from lxml import etree
-from lxml.cssselect import CSSSelector
-import html5lib
-from common import Food
-from common import formt
-import multiprocessing
-
-mensenliste = {"TU Hardenberg" : "mensa-tu-hardenbergstra%C3%9Fe", "TU Marchstraße": "cafeteria-tu-marchstra%C3%9Fe", "TU Skyline": "cafeteria-tu-skyline", "TU Architektur": "cafeteria-tu-architektur", "TU Ackerstraße": "cafeteria-tu-ackerstra%C3%9Fe"}
-
-
-def get_food_items(mensa="mensa-tu-hardenbergstra%C3%9Fe", ignore_nudelauswahl=False) :
- user_agent = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64)'
- headers = {'User-Agent': user_agent}
-
- req = urllib.request.Request('https://www.stw.berlin/mensen/%s.html' % mensa, headers=headers)
- response = urllib.request.urlopen(req)
- the_page = response.read()
- document = html5lib.parse(the_page, treebuilder="lxml")
- groupsel = CSSSelector('.splGroupWrapper')
- groups = [e for e in groupsel(document)]
- fl = []
- for i in groups :
- name = CSSSelector('.splGroup')(i)[0].text
- sel = CSSSelector('.splMeal')
- meals = [e for e in sel(i)]
- for m in meals :
- namesel = CSSSelector('.bold')
- nm = namesel(m)[0].text
- if ignore_nudelauswahl and "Nudelauswahl" in nm:
- continue
- pricesel = CSSSelector('.col-md-3')
- veg = 0
- if len(pricesel(m)[0]) >= 2 :
- if "15" in pricesel(m)[0][1].attrib["src"] :
- veg = 2
- elif "1.png" in pricesel(m)[0][1].attrib["src"] :
- veg = 1
- price = pricesel(m)[-1].text.strip()
- fl.append(Food(nm, price, name, veg))
- return fl
-
-def pr_f(j) :
- i,k = j
- food = get_food_items(k, ignore_nudelauswahl=True)
- return (i,"*"*20+i+"*"*20+"\n"+formt(food))
-
-
-# format:
-if __name__ == "__main__":
- pool = multiprocessing.Pool(4)
- k = pool.map(pr_f, list(mensenliste.items()))
- k.sort(key=lambda x: x[0])
- for i in k :
- print(i[1])
diff --git a/run.py b/run.py
new file mode 100755
index 0000000..7ea99fe
--- /dev/null
+++ b/run.py
@@ -0,0 +1,16 @@
+#!/usr/bin/python3
+from yapsy.PluginManager import PluginManager
+backends = PluginManager()
+backends.setPluginPlaces(["./backends"])
+backends.collectPlugins()
+import base
+for pluginInfo in backends.getAllPlugins():
+ backends.activatePluginByName(pluginInfo.name)
+ pluginInfo.plugin_object.register_restaurants()
+
+for k,i in base.foodsources.items() :
+ try :
+ food = i.get_food()
+ print("*"*20+i.human_name+"*"*20+"\n"+base.formt(food))
+ except base.NoMenuError:
+ print(i.human_name + ": No menu found. This could be due to a holiday or due to an error in the script.")
diff --git a/satyam.py b/satyam.py
deleted file mode 100644
index 19e8387..0000000
--- a/satyam.py
+++ /dev/null
@@ -1,34 +0,0 @@
-import urllib.request, urllib.error, urllib.parse
-from lxml import etree
-from lxml.cssselect import CSSSelector
-import html5lib
-from common import Food
-from common import formt
-import re
-import sys
-
-
-def get_food_items() :
- sys.stderr = open("/dev/null", "w")
- user_agent = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64)'
- headers = {'User-Agent': user_agent}
-
- req = urllib.request.Request('http://www.mysatyam.de/angebote/express-mittagstisch.html', headers=headers)
- response = urllib.request.urlopen(req)
- the_page = response.read()
- document = html5lib.parse(the_page, treebuilder="lxml")
- groupsel = CSSSelector('.news-latest-item-content')
- k = etree.tostring(groupsel(document)[0])
- name = re.sub(r'<.+?>', ' ', str(k))
- name = etree.fromstring("<p>%s</p>"%name).text.strip()
- name = name.replace("\\n", "")
- name = " ".join(name.split())
-
- name = name.replace("5,95 €", "")
-# print(name[3:-1])
- return [Food("Mittagstisch Express", "5,95 €", "Mittagstisch", 2, name[3:-1])]
-
-
-if __name__ == "__main__":
- food = get_food_items()
- print(formt(food))
diff --git a/singh.py b/singh.py
deleted file mode 100644
index 8f272a7..0000000
--- a/singh.py
+++ /dev/null
@@ -1,51 +0,0 @@
-import urllib.request, urllib.error, urllib.parse
-from lxml import etree
-from lxml.cssselect import CSSSelector
-import html5lib
-from common import Food
-from common import formt
-import re
-import sys
-import datetime
-
-
-def get_food_items() :
- sys.stderr = open("/dev/null", "w")
- weekday = datetime.datetime.today().weekday()
- if weekday > 4 :
- print("Error: No food today")
- return ""
- user_agent = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64)'
- headers = {'User-Agent': user_agent}
-
- req = urllib.request.Request('http://singh-catering.de/cafe/', headers=headers)
- response = urllib.request.urlopen(req)
- the_page = response.read()
- document = html5lib.parse(the_page, treebuilder="lxml")
- groupsel = CSSSelector('.menu-list__items')
- myorder=[0,3,1,4,2]
- mylist = [ groupsel(document)[i] for i in myorder]
- i = mylist[weekday]
- fl = []
- nmsel = CSSSelector('.menu-list__item')
- for k in nmsel(i):
- veg = 0
- titsel = CSSSelector('.item_title')
- name = titsel(k)[0].text
- dscsel = CSSSelector('.desc__content')
- desc = dscsel(k)[0].text
- prsel = CSSSelector('.menu-list__item-price')
- price = prsel(k)[0].text
- vegsel = CSSSelector('.menu-list__item-highlight-title')
- if len(vegsel(k)) > 0 :
- if "VEGETARISCH" in vegsel(k)[0].text :
- veg = 1
- elif "VEGAN" in vegsel(k)[0].text :
- veg = 2
- fl.append(Food(name, price, "Essen", veg, desc))
- return fl
-
-if __name__ == "__main__":
- food = get_food_items()
- print(formt(food))
-