iAdding some commands and uuid handling. - zs - Zeitungsschau rss to email converter Err gopher.r-36.net 70 i Err gopher.r-36.net 70 1Log /scm/zs//log.gph gopher.r-36.net 70 1Files /scm/zs//files.gph gopher.r-36.net 70 1Refs /scm/zs//refs.gph gopher.r-36.net 70 1LICENSE /scm/zs//file/LICENSE.gph gopher.r-36.net 70 i--- Err gopher.r-36.net 70 1commit bea5daebe99ff92fffec41f86332fc3b3621162e /scm/zs//commit/bea5daebe99ff92fffec41f86332fc3b3621162e.gph gopher.r-36.net 70 1parent 748d7c673ea8efc9164e2386f32f93847b617d8b /scm/zs//commit/748d7c673ea8efc9164e2386f32f93847b617d8b.gph gopher.r-36.net 70 hAuthor: Christoph Lohmann <20h@r-36.net> URL:mailto:20h@r-36.net gopher.r-36.net 70 iDate: Mon, 28 Apr 2014 20:50:41 +0200 Err gopher.r-36.net 70 i Err gopher.r-36.net 70 iAdding some commands and uuid handling. Err gopher.r-36.net 70 i Err gopher.r-36.net 70 iuuid: Better difference handling in feed merge. Err gopher.r-36.net 70 icommands: Handle ids and reset. Err gopher.r-36.net 70 i Err gopher.r-36.net 70 iDiffstat: Err gopher.r-36.net 70 i feed.py | 12 ++++++++++-- Err gopher.r-36.net 70 i feeddb.py | 21 +++++++++++++++++---- Err gopher.r-36.net 70 i zs.py | 39 +++++++++++++++++++++++++++---- Err gopher.r-36.net 70 i Err gopher.r-36.net 70 i3 files changed, 62 insertions(+), 10 deletions(-) Err gopher.r-36.net 70 i--- Err gopher.r-36.net 70 1diff --git a/feed.py b/feed.py /scm/zs//file/feed.py.gph gopher.r-36.net 70 i@@ -183,8 +183,16 @@ def parse(astr): Err gopher.r-36.net 70 i else: Err gopher.r-36.net 70 i article["id"] = article["text"][:30] Err gopher.r-36.net 70 i Err gopher.r-36.net 70 i+ article["uuid"] = "%s" % (article["updated"]) Err gopher.r-36.net 70 i+ for e in ("id", "title", "file"): Err gopher.r-36.net 70 i+ if e in article: Err gopher.r-36.net 70 i+ article["uuid"] = "%s-%s" % \ Err gopher.r-36.net 70 i+ (article["uuid"],\ Err gopher.r-36.net 70 i+ article[e]) Err gopher.r-36.net 70 i+ Err gopher.r-36.net 70 i # sanity checks Err gopher.r-36.net 70 i- if "title" not in article and "text" not in article: Err gopher.r-36.net 70 i+ if "title" not in article and "text" not in article \ Err gopher.r-36.net 70 i+ and "file" not in article: Err gopher.r-36.net 70 i continue Err gopher.r-36.net 70 i Err gopher.r-36.net 70 i articles.append(article) Err gopher.r-36.net 70 i@@ -197,5 +205,5 @@ class feedopener(urllib.request.FancyURLopener): Err gopher.r-36.net 70 i urllib.request._urlopener = feedopener Err gopher.r-36.net 70 i Err gopher.r-36.net 70 i def fetch(uri): Err gopher.r-36.net 70 i- return parse(urllib.request.urlopen(uri).read()) Err gopher.r-36.net 70 i+ return parse(urllib.request.urlopen(uri, timeout=5).read()) Err gopher.r-36.net 70 i Err gopher.r-36.net 70 1diff --git a/feeddb.py b/feeddb.py /scm/zs//file/feeddb.py.gph gopher.r-36.net 70 i@@ -164,8 +164,8 @@ class feeddb(object): Err gopher.r-36.net 70 i Err gopher.r-36.net 70 i history = feed["articles"] Err gopher.r-36.net 70 i for article in curfeed["articles"]: Err gopher.r-36.net 70 i- a = [art for art in history if art["id"] == \ Err gopher.r-36.net 70 i- article["id"]] Err gopher.r-36.net 70 i+ a = [art for art in history if art["uuid"] == \ Err gopher.r-36.net 70 i+ article["uuid"]] Err gopher.r-36.net 70 i if len(a) == 0: Err gopher.r-36.net 70 i article["unread"] = True Err gopher.r-36.net 70 i history.append(article) Err gopher.r-36.net 70 i@@ -201,14 +201,27 @@ class feeddb(object): Err gopher.r-36.net 70 i Err gopher.r-36.net 70 i return rfeed Err gopher.r-36.net 70 i Err gopher.r-36.net 70 i+ def setarticleunread(self, uri, ids): Err gopher.r-36.net 70 i+ feed = self.readfeed(uri) Err gopher.r-36.net 70 i+ if feed == None: Err gopher.r-36.net 70 i+ return Err gopher.r-36.net 70 i+ Err gopher.r-36.net 70 i+ for article in feed["articles"]: Err gopher.r-36.net 70 i+ a = [art for art in feed["articles"] if art["uuid"] == \ Err gopher.r-36.net 70 i+ ids] Err gopher.r-36.net 70 i+ if len(a) > 0: Err gopher.r-36.net 70 i+ for aa in a: Err gopher.r-36.net 70 i+ aa["unread"] = True Err gopher.r-36.net 70 i+ self.writefeed(uri, feed); Err gopher.r-36.net 70 i+ Err gopher.r-36.net 70 i def setreadarticles(self, uri, curfeed=None): Err gopher.r-36.net 70 i feed = self.readfeed(uri) Err gopher.r-36.net 70 i if feed == None: Err gopher.r-36.net 70 i return Err gopher.r-36.net 70 i Err gopher.r-36.net 70 i for article in curfeed["articles"]: Err gopher.r-36.net 70 i- a = [art for art in curfeed["articles"] if art["id"] == \ Err gopher.r-36.net 70 i- article["id"]] Err gopher.r-36.net 70 i+ a = [art for art in curfeed["articles"] if art["uuid"] == \ Err gopher.r-36.net 70 i+ article["uuid"]] Err gopher.r-36.net 70 i if len(a) > 0: Err gopher.r-36.net 70 i for aa in a: Err gopher.r-36.net 70 i aa["unread"] = False Err gopher.r-36.net 70 1diff --git a/zs.py b/zs.py /scm/zs//file/zs.py.gph gopher.r-36.net 70 i@@ -15,6 +15,11 @@ import urllib.error Err gopher.r-36.net 70 i import socket Err gopher.r-36.net 70 i import http.client Err gopher.r-36.net 70 i Err gopher.r-36.net 70 i+def sendfeed(db, ufeed): Err gopher.r-36.net 70 i+ feedemail.send(ufeed, db.cfg["email"], db.cfg["smtphost"], \ Err gopher.r-36.net 70 i+ db.cfg["smtpport"], db.cfg["smtpssl"], \ Err gopher.r-36.net 70 i+ db.cfg["smtpuser"], db.cfg["smtppassword"]) Err gopher.r-36.net 70 i+ Err gopher.r-36.net 70 i def run(db, selfeed=None, dryrun=False): Err gopher.r-36.net 70 i feeduris = db.listfeeds() Err gopher.r-36.net 70 i Err gopher.r-36.net 70 i@@ -29,6 +34,7 @@ def run(db, selfeed=None, dryrun=False): Err gopher.r-36.net 70 i retries = db.getretry(feeduri) Err gopher.r-36.net 70 i estr = None Err gopher.r-36.net 70 i print("fetch %s" % (feeduri)) Err gopher.r-36.net 70 i+ curfeed = None Err gopher.r-36.net 70 i try: Err gopher.r-36.net 70 i curfeed = feed.fetch(feeduri) Err gopher.r-36.net 70 i except urllib.error.HTTPError as err: Err gopher.r-36.net 70 i@@ -37,6 +43,8 @@ def run(db, selfeed=None, dryrun=False): Err gopher.r-36.net 70 i retries += 1 Err gopher.r-36.net 70 i except socket.gaierror: Err gopher.r-36.net 70 i continue Err gopher.r-36.net 70 i+ except socket.timeout: Err gopher.r-36.net 70 i+ continue Err gopher.r-36.net 70 i except urllib.error.URLError: Err gopher.r-36.net 70 i continue Err gopher.r-36.net 70 i except TimeoutError: Err gopher.r-36.net 70 i@@ -76,11 +84,8 @@ def run(db, selfeed=None, dryrun=False): Err gopher.r-36.net 70 i if len(ufeed["articles"]) > 0: Err gopher.r-36.net 70 i print("cur %d unread %d" % (clen, \ Err gopher.r-36.net 70 i len(ufeed["articles"]))) Err gopher.r-36.net 70 i- Err gopher.r-36.net 70 i if dryrun == False: Err gopher.r-36.net 70 i- feedemail.send(ufeed, db.cfg["email"], db.cfg["smtphost"], \ Err gopher.r-36.net 70 i- db.cfg["smtpport"], db.cfg["smtpssl"], \ Err gopher.r-36.net 70 i- db.cfg["smtpuser"], db.cfg["smtppassword"]) Err gopher.r-36.net 70 i+ sendfeed(db, ufeed) Err gopher.r-36.net 70 i db.setreadarticles(feeduri, ufeed) Err gopher.r-36.net 70 i Err gopher.r-36.net 70 i def usage(app): Err gopher.r-36.net 70 i@@ -121,6 +126,12 @@ def main(args): Err gopher.r-36.net 70 i else: Err gopher.r-36.net 70 i db.cfg[args[2]] = args[3] Err gopher.r-36.net 70 i print("%s = '%s'" % (args[2], db.cfg[args[2]])) Err gopher.r-36.net 70 i+ Err gopher.r-36.net 70 i+ elif args[1] == "cfgdel": Err gopher.r-36.net 70 i+ if len(args) < 3: Err gopher.r-36.net 70 i+ usage(args[0]) Err gopher.r-36.net 70 i+ if args[2] in db.cfg: Err gopher.r-36.net 70 i+ del db.cfg[args[2]] Err gopher.r-36.net 70 i Err gopher.r-36.net 70 i elif args[1] == "add": Err gopher.r-36.net 70 i if len(args) < 3: Err gopher.r-36.net 70 i@@ -131,6 +142,26 @@ def main(args): Err gopher.r-36.net 70 i for f in db.listfeeds(): Err gopher.r-36.net 70 i print(f) Err gopher.r-36.net 70 i Err gopher.r-36.net 70 i+ elif args[1] == "listuuids": Err gopher.r-36.net 70 i+ if len(args) < 3: Err gopher.r-36.net 70 i+ usage(args[0]) Err gopher.r-36.net 70 i+ feed = db.readfeed(args[2]) Err gopher.r-36.net 70 i+ for art in feed["articles"]: Err gopher.r-36.net 70 i+ print("%s: %s: %s" % (art["uuid"], art["link"],\ Err gopher.r-36.net 70 i+ art["title"])) Err gopher.r-36.net 70 i+ Err gopher.r-36.net 70 i+ elif args[1] == "unread": Err gopher.r-36.net 70 i+ if len(args) < 4: Err gopher.r-36.net 70 i+ usage(args[0]) Err gopher.r-36.net 70 i+ db.setarticleunread(args[2], args[3]) Err gopher.r-36.net 70 i+ Err gopher.r-36.net 70 i+ elif args[1] == "resend": Err gopher.r-36.net 70 i+ if len(args) < 3: Err gopher.r-36.net 70 i+ usage(args[0]) Err gopher.r-36.net 70 i+ ufeed = db.unreadarticles(args[2]) Err gopher.r-36.net 70 i+ sendfeed(db, ufeed) Err gopher.r-36.net 70 i+ db.setreadarticles(args[2], ufeed) Err gopher.r-36.net 70 i+ Err gopher.r-36.net 70 i elif args[1] == "del": Err gopher.r-36.net 70 i if len(args) < 3: Err gopher.r-36.net 70 i usage(args[0]) Err gopher.r-36.net 70 .