diff --git a/CHANGELOG b/CHANGELOG index 93a6a66..bea8cc2 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,7 @@ +2015-05-06 1.0.9 mc2xml integration (please read manual) + Manual updated to be read + SQL refactoring and minor fixes + 2015-03-28 1.0.8 EPG Chart date buttons mc2xml support Minor fixes diff --git a/config.py b/config.py index 2ff9e1d..a7364eb 100644 --- a/config.py +++ b/config.py @@ -48,7 +48,7 @@ 'cfg_server_bind_address', 'Server bind address (restart needed)', '0.0.0.0' -], +], [ 'cfg_server_port', @@ -61,7 +61,7 @@ "File extension for the recorded stream (default='.ts')", '.ts' ], - + [ 'cfg_ffmpeg_path', 'Full path to ffmpeg for other streams support', @@ -73,19 +73,19 @@ 'Stream types, which should be forwarded to ffmpeg (space separated)', 'rtmp rtp' ], - + [ 'cfg_ffmpeg_params', "Additional output arguments for ffmpeg (default: '-acodec copy -vcodec copy')", '-acodec copy -vcodec copy' -], - +], + [ 'cfg_grab_time', "Time to perform daily EPG grab on all marked channels (hh:mm format, 24h based, default '0' for manual only)", '0' ], - + [ 'cfg_grab_max_duration', "Maximal EPG scan duration per channel, [seconds] (default '60')", @@ -165,8 +165,8 @@ for config in configuration: globals()[config[0]] = config[2] - -def getUser(): + +def getUser(): rows = sqlRun("SELECT value FROM config WHERE param='credentials'") if rows: return rows[0][0] @@ -174,31 +174,31 @@ def getUser(): return setUser("") def setUser(userhash): - sqlRun("UPDATE config SET value = '%s' WHERE param='credentials'" % userhash) + sqlRun("UPDATE config SET value = ? WHERE param='credentials'", (userhash, )) return userhash def banIP(ip): - rows = sqlRun("SELECT trycount FROM blacklist WHERE ip='%s'" % ip) + rows = sqlRun("SELECT trycount FROM blacklist WHERE ip=?", (ip, )) now = datetime.strftime(datetime.now(), "%Y-%m-%d %H:%M:%S") if rows: - sqlRun("UPDATE blacklist SET trycount=%s, lasttry='%s' WHERE ip='%s'" % (rows[0][0]+1, now, ip) ) + sqlRun("UPDATE blacklist SET trycount=?, lasttry=? WHERE ip=?", (rows[0][0]+1, now, ip)) if rows[0][0]+1==3: print ("IP %s has been blacklisted for for three unsuccessful login attempts" % ip) else: - sqlRun("INSERT INTO blacklist VALUES ('%s', %s, '%s')" % (ip, 1, now) ) - + sqlRun("INSERT INTO blacklist VALUES (?, ?, ?)", (ip, 1, now) ) + def clearIP(ip): - sqlRun("DELETE FROM blacklist WHERE ip='%s'" % ip) - + sqlRun("DELETE FROM blacklist WHERE ip=?", (ip, )) + def checkIP(ip): sqlRun("DELETE FROM blacklist WHERE julianday('now', 'localtime')-julianday(lasttry)>=2;") - rows = sqlRun("SELECT trycount FROM blacklist WHERE ip='%s'" % ip) + rows = sqlRun("SELECT trycount FROM blacklist WHERE ip=?", (ip, )) if rows: if rows[0][0]>=3: - return False + return False return True - + def getDict(): ret = [] for r in globals(): @@ -211,7 +211,7 @@ def loadConfig(): rows = sqlRun("SELECT param, value FROM config WHERE param<>'cfg_version'") setConfig(rows) return - + def setConfig(attrlist = []): for attr in attrlist: if attr[0] in globals(): @@ -220,27 +220,27 @@ def setConfig(attrlist = []): writeWebman(int(attr[1])) if attr[0]=="cfg_recordpath": if attr[1][-1]!="/" and attr[1][-1]!="\\": - if "\\" in attr[1]: + if "\\" in attr[1]: attr=(attr[0], attr[1]+"\\") else: attr=(attr[0], attr[1]+"/") - globals()[attr[0]] = attr[1] + globals()[attr[0]] = attr[1] saveConfig() - - + + def saveConfig(): - sql = '' + sql = '' for var in getDict(): - sql += "UPDATE config SET value='%s' WHERE param='%s';" % (globals()[var], var) + sql += "UPDATE config SET value='%s' WHERE param='%s';" % (globals()[var], var) sqlRun(sql, -1, 1) # Port changes should also be written in the Synology Webman configuration -def writeWebman(port): +def writeWebman(port): webman = list() lfile = open("webman/config", "rb") for lline in lfile: webman.append(lline) - lfile.close() + lfile.close() lfile = open("webman/config", "wb") for lline in webman: pos = lline.find('"port":') @@ -250,6 +250,6 @@ def writeWebman(port): lfile.write(lline) lfile.close() print ("Port changes saved, new port: %s, please restart the software" % str(port)) - return - + return + diff --git a/manual.pdf b/manual.pdf index 74d5d47..b3fd8c6 100644 Binary files a/manual.pdf and b/manual.pdf differ diff --git a/mylogging.py b/mylogging.py index 2d69446..2a43a78 100644 --- a/mylogging.py +++ b/mylogging.py @@ -53,7 +53,7 @@ def write(self, message): self.log.write(datetime.now().strftime("%Y-%m-%d %H:%M:%S") + " " + self.typ + " " + mylines + "\n") # except Exception as ex: # pass - + def flush(self): pass diff --git a/synology/INFO b/synology/INFO index 8304e3f..6844f8a 100644 --- a/synology/INFO +++ b/synology/INFO @@ -1,5 +1,5 @@ package="tvstreamrecord" -version="1.0.8" +version="1.0.9" maintainer="Pavion" description="Program to record TV streams. Python required. Server runs at port 8030 (changeable)" reloadui="yes" diff --git a/timezone.py b/timezone.py index 96e785c..f4ffa50 100644 --- a/timezone.py +++ b/timezone.py @@ -34,10 +34,10 @@ def _isdst(self, dt): stamp = _time.mktime(tt) tt = _time.localtime(stamp) return tt.tm_isdst > 0 - + Local = LocalTimezone() def tDiff(dt2, dt1): return (dt2 - dt1) - (Local.dst(dt2) - Local.dst(dt1)) - - + + diff --git a/tvstreamrecord.py b/tvstreamrecord.py index c1e1df2..8802c0d 100644 --- a/tvstreamrecord.py +++ b/tvstreamrecord.py @@ -44,9 +44,9 @@ import codecs def total(timedelta): - try: + try: return timedelta.total_seconds() - except: + except: return (timedelta.microseconds + (timedelta.seconds + timedelta.days * 24 * 3600) * 10**6) / 10**6 records = [] @@ -54,11 +54,11 @@ def total(timedelta): localtime = "%H:%M" localdate = "%d.%m.%Y" dayshown = datetime.combine(date.today(), time.min) -version = '1.0.8' +version = '1.0.9' @route('/live/') def server_static9(filename): - rows = sqlRun("SELECT * FROM channels WHERE cid=%s" % filename.split(".")[0]) + rows = sqlRun("SELECT * FROM channels WHERE cid=?", (filename.split(".")[0], )) if rows: write_m3u(rows[0][0], rows[0][1]) else: @@ -207,7 +207,7 @@ def internationalize(templ,noheader=False): def fileexists(file): try: - return os.path.isfile(file) + return os.path.isfile(file) except Exception as ex: return os.path.isfile(file.encode('utf-8').decode(sys.getfilesystemencoding())) @@ -215,10 +215,10 @@ def fileexists(file): @route('/') @route('/login') -def root_s(): +def root_s(): agent = request.headers.get('User-Agent') if ("Android" in agent and "Mobile" in agent) or "berry" in agent or "Symbian" in agent or "Nokia" in agent or "iPhone" in agent: - count = sqlRun("select count(cid) from channels where cenabled=1")[0][0] + count = sqlRun("select count(cid) from channels where cenabled=1")[0][0] if count > 0: redirect("/mobile") else: @@ -302,7 +302,7 @@ def clgen_p(): @post('/grab_channel') def grabchannel(): myid = request.forms.myid - sqlRun("UPDATE channels SET epgscan=-epgscan+1 WHERE cid = %s" % myid) + sqlRun("UPDATE channels SET epgscan=-epgscan+1 WHERE cid = ?", (myid, )) return @post('/create_channel') @@ -332,39 +332,39 @@ def createchannel(): return if cext!='': - if cext[0:1]!='.': + if cext[0:1]!='.': cext = '.' + cext exists = False if cid == prev: exists = True else: - rows3 = sqlRun("select cid from channels where cid=%s" % cid) + rows3 = sqlRun("select cid from channels where cid=?", (cid, )) if rows3: exists = True if prev!=-1: if cid == prev: # editing/renaming only - sqlRun("UPDATE channels SET cname='%s', cpath='%s', cext='%s', cenabled=%s, epgscan=%s WHERE cid=%s" % (cname, cpath, cext, aktiv, epggrab, cid)) + sqlRun("UPDATE channels SET cname=?, cpath=?, cext=?, cenabled=?, epgscan=? WHERE cid=?", (cname, cpath, cext, aktiv, epggrab, cid)) else: # also moving if exists: - sqlRun("UPDATE channels SET cid = -1 WHERE cid = %s" % (prev)) - sqlRun("UPDATE records SET cid = -1 WHERE cid = %s" % (prev)) + sqlRun("UPDATE channels SET cid = -1 WHERE cid = ?", (prev, )) + sqlRun("UPDATE records SET cid = -1 WHERE cid = ?", (prev, )) if prev > cid: sqlRun("UPDATE channels SET cid = cid+1 WHERE cid >= %s AND cid < %s" % (cid, prev)) sqlRun("UPDATE records SET cid = cid+1 WHERE cid >= %s AND cid < %s" % (cid, prev)) else: sqlRun("UPDATE channels SET cid = cid-1 WHERE cid > %s AND cid <= %s" % (prev, cid)) sqlRun("UPDATE records SET cid = cid-1 WHERE cid > %s AND cid <= %s" % (prev, cid)) - sqlRun("UPDATE channels SET cname='%s', cid=%s, cpath='%s', cext='%s', cenabled=%s, epgscan=%s WHERE cid=-1" % (cname, cid, cpath, cext, aktiv, epggrab)) - sqlRun("UPDATE records SET cid=%s WHERE cid=-1" % cid) + sqlRun("UPDATE channels SET cname=?, cid=?, cpath=?, cext=?, cenabled=?, epgscan=? WHERE cid=-1", (cname, cid, cpath, cext, aktiv, epggrab)) + sqlRun("UPDATE records SET cid=? WHERE cid=-1", (cid, )) else: - sqlRun("UPDATE channels SET cname='%s', cid=%s, cpath='%s', cext='%s', cenabled=%s, epgscan=%s WHERE cid=%s" % (cname, cid, cpath, cext, aktiv, epggrab, prev)) - sqlRun("UPDATE records SET cid=%s WHERE cid=%s" % (cid, prev)) + sqlRun("UPDATE channels SET cname=?, cid=?, cpath=?, cext=?, cenabled=?, epgscan=? WHERE cid=?", (cname, cid, cpath, cext, aktiv, epggrab, prev)) + sqlRun("UPDATE records SET cid=? WHERE cid=?", (cid, prev)) else: if exists: - sqlRun("UPDATE channels SET cid = cid+1 WHERE cid >= %s" % cid) - sqlRun("UPDATE records SET cid = cid+1 WHERE cid >= %s" % cid) + sqlRun("UPDATE channels SET cid = cid+1 WHERE cid >= ?", (cid, )) + sqlRun("UPDATE records SET cid = cid+1 WHERE cid >= ?", (cid, )) sqlRun("INSERT INTO channels VALUES (?, ?, ?, ?, ?, ?)", (cname, cpath, aktiv, cext, cid, epggrab)) return @@ -540,8 +540,8 @@ def grabXML(self): print ("mc2xml ended without errors") except Exception as ex: print ("Error calling mc2xml: %s" % (ex)) - pass - + pass + try: xmltv.getProgList(version) except Exception as ex: @@ -564,7 +564,7 @@ def grabStream(self): for l in fulllist: actname = l[0] if actname!=prevname: - rows2 = sqlRun("SELECT cid FROM channels WHERE cenabled = 1 AND lower(cname)='%s'" % actname.lower()) + rows2 = sqlRun("SELECT cid FROM channels WHERE cenabled = 1 AND lower(cname)=?", (actname.lower(), )) if rows2: cid = rows2[0][0] sqlchlist.append([cid, actname, datetime.strftime(datetime.now(), "%Y-%m-%d %H:%M:%S") ] ) @@ -658,11 +658,11 @@ def epg_s(): rtemp.append([-1, x, w, t.strftime("%H:%M"), "", "", "", -1, "", 0]) ret.append(rtemp) - rows=sqlRun("SELECT guide.g_id, channels.cid, channels.cname FROM guide, guide_chan, channels WHERE channels.cenabled=1 AND channels.cname=guide_chan.g_name AND guide.g_id=guide_chan.g_id AND (date(g_start)=date('%s') OR date(g_stop)=date('%s')) GROUP BY channels.cid ORDER BY channels.cid" % (todaysql, todaysql)) + rows=sqlRun("SELECT guide.g_id, channels.cid, channels.cname FROM guide, guide_chan, channels WHERE channels.cenabled=1 AND channels.cname=guide_chan.g_name AND guide.g_id=guide_chan.g_id AND (date(g_start)=date(?) OR date(g_stop)=date(?)) GROUP BY channels.cid ORDER BY channels.cid", (todaysql, todaysql)) for row in rows: cid=row[1] rtemp = list() - c_rows=sqlRun("SELECT g_title, g_start, g_stop, g_desc, guide.rowid, (records.renabled is not null and records.renabled = 1) FROM guide LEFT JOIN records ON records.cid=%s AND datetime(guide.g_start, '-%s minutes')=records.rvon and datetime(guide.g_stop, '+%s minutes')=records.rbis WHERE (date(g_start)=date('%s') OR date(g_stop)=date('%s')) AND datetime(g_stop, '+60 minutes')>datetime('now', 'localtime') AND g_id='%s' ORDER BY g_start" % (cid, config.cfg_delta_for_epg, config.cfg_delta_for_epg, todaysql, todaysql, row[0])) + c_rows=sqlRun("SELECT g_title, g_start, g_stop, g_desc, guide.rowid, (records.renabled is not null and records.renabled = 1) FROM guide LEFT JOIN records ON records.cid=? AND datetime(guide.g_start, '-%s minutes')=records.rvon and datetime(guide.g_stop, '+%s minutes')=records.rbis WHERE (date(g_start)=date(?) OR date(g_stop)=date(?)) AND datetime(g_stop, '+60 minutes')>datetime('now', 'localtime') AND g_id=? ORDER BY g_start" % (config.cfg_delta_for_epg, config.cfg_delta_for_epg), (cid, todaysql, todaysql, row[0])) for event in c_rows: d_von = datetime.strptime(event[1],"%Y-%m-%d %H:%M:%S") @@ -730,7 +730,7 @@ def epglist_getter(): return json.dumps( {"aaData": retlist, - "sEcho": sEcho, + "sEcho": sEcho, "iTotalRecords": totalrows, "iTotalDisplayRecords": totalrows } ) @@ -746,17 +746,17 @@ def getLocale(): f = codecs.open("js/i18n/jquery.ui.datepicker-" + config.cfg_locale + ".js", "r", "utf-8") loc = f.read() f.close() - p1 = loc.find("{") + p1 = loc.find("{") p1 = loc.find("{", p1+1) p2 = loc.find("}", p1+1) full = loc[p1+2:p2] f = codecs.open("js/i18n/jquery-ui-timepicker-" + config.cfg_locale + ".js", "r", "utf-8") loc = f.read() f.close() - p1 = loc.find("{") + p1 = loc.find("{") p1 = loc.find("{", p1+1) p2 = loc.find("}", p1+1) - full = full + "," + loc[p1+1:p2] + full = full + "," + loc[p1+1:p2] #full = full.replace('\t', '').replace(',\n', ',"').replace(': ', '": ').replace('\n', '').replace("\"'",'"').replace("'",'"') full = full.replace('\t', '').replace(',\n', ',"').replace(': ', '": ').replace('\n', '').replace("\"'",'"').replace("'",'"') return '{"' + full + '}' @@ -770,7 +770,7 @@ def records_s(): @route('/getchannelgroups') def getchannelgroups(): - l = [] + l = [] sql = "case WHEN substr(upper(cname), 1, 1) >= 'A' AND substr(upper(cname), 1, 1) <= 'Z' THEN substr(upper(cname), 1, 1) ELSE '0' END" sql = "select " + sql + ", count(cname) from channels where cenabled=1 group by " + sql rows=sqlRun(sql) @@ -780,7 +780,7 @@ def getchannelgroups(): @post('/getchannelgroup') def getchannelgroup(): - l = [] + l = [] id = request.forms.get("id") sql = "select cid, cname from channels where cenabled=1 " if id=='-': @@ -792,7 +792,7 @@ def getchannelgroup(): rows=sqlRun(sql) for row in rows: l.append([row[0], row[1]]) - return json.dumps({"aaData": l} ) + return json.dumps({"aaData": l} ) @post('/getepgday') def getepgday(): @@ -802,10 +802,9 @@ def getepgday(): except: pass rdate = request.forms.get("rdate") - sql = "SELECT substr(g_title,1,50), g_start, substr(g_desc, 1, 100), g_stop FROM guide, guide_chan WHERE guide.g_id = guide_chan.g_id AND guide_chan.g_name='{0}' AND (date(g_start)=date('{1}') OR date(g_stop)=date('{1}')) AND datetime(guide.g_stop)>datetime('now', 'localtime') ORDER BY g_start".format(cname, rdate) - rows=sqlRun(sql) - if rows: - return json.dumps({"aaData": rows} ) + rows=sqlRun("SELECT substr(g_title,1,50), g_start, substr(g_desc, 1, 100), g_stop FROM guide, guide_chan WHERE guide.g_id = guide_chan.g_id AND guide_chan.g_name=? AND (date(g_start)=date(?) OR date(g_stop)=date(?)) AND datetime(guide.g_stop)>datetime('now', 'localtime') ORDER BY g_start", (cname, rdate, rdate)) + if rows: + return json.dumps({"aaData": rows} ) else: return None @@ -814,7 +813,6 @@ def getepgday(): @route('/getrecordlist') def getrecordlist(): l = [] -# rows=sqlRun("SELECT recname, cname, strftime('"+"%"+"d."+"%"+"m."+"%"+"Y "+"%"+"H:"+"%"+"M', rvon), strftime('"+"%"+"d."+"%"+"m."+"%"+"Y "+"%"+"H:"+"%"+"M', rbis), rmask, renabled, 100*(strftime('%s','now', 'localtime')-strftime('%s',rvon)) / (strftime('%s',rbis)-strftime('%s',rvon)), records.rowid, rvon, rbis, channels.cid FROM channels, records where channels.cid=records.cid ORDER BY rvon") rows=sqlRun("SELECT recname, cname, rvon, rbis, rmask, renabled, 100*(strftime('%s','now', 'localtime')-strftime('%s',rvon)) / (strftime('%s',rbis)-strftime('%s',rvon)), records.rowid, rvon, rbis, channels.cid FROM channels, records where channels.cid=records.cid ORDER BY rvon") for row in rows: m3u = "" + row[1] + "" @@ -832,9 +830,9 @@ def records_p(): if what=="-2": sqlRun("DELETE FROM records WHERE datetime(rbis)0") if what=="-1": - sqlRun("DELETE FROM records WHERE records.rowid=%s" % (myid)) + sqlRun("DELETE FROM records WHERE records.rowid=?", (myid, )) else: - sqlRun("UPDATE records SET renabled=%s WHERE rowid=%s" % (what, myid)) + sqlRun("UPDATE records SET renabled=? WHERE rowid=?" % (what, myid)) setRecords() return @@ -842,7 +840,7 @@ def records_p(): @post('/createepg') def createepg(): - sqlRun("INSERT INTO records SELECT guide.g_title, channels.cid, datetime(guide.g_start, '-%s minutes'), datetime(guide.g_stop, '+%s minutes'), 1, 0 FROM guide, guide_chan, channels WHERE guide.g_id = guide_chan.g_id AND channels.cname = guide_chan.g_name AND guide.rowid=%s GROUP BY datetime(guide.g_start, '-%s minutes')" % (config.cfg_delta_for_epg, config.cfg_delta_for_epg, request.forms.ret, config.cfg_delta_for_epg)) + sqlRun("INSERT INTO records SELECT guide.g_title, channels.cid, datetime(guide.g_start, '-%s minutes'), datetime(guide.g_stop, '+%s minutes'), 1, 0 FROM guide, guide_chan, channels WHERE guide.g_id = guide_chan.g_id AND channels.cname = guide_chan.g_name AND guide.rowid=? GROUP BY datetime(guide.g_start, '-? minutes')" % (config.cfg_delta_for_epg, config.cfg_delta_for_epg), (request.forms.ret, config.cfg_delta_for_epg)) setRecords() redirect("/records") return @@ -869,7 +867,7 @@ def create_p(): if prev=="": sqlRun("INSERT INTO records VALUES (?, ?, ?, ?, ?, ?)", (recname, sender, d_von, d_bis, aktiv, recurr)) else: - sqlRun("UPDATE records SET recname='%s', cid=%s, rvon='%s', rbis='%s', renabled=%s, rmask=%s WHERE rowid=%s" % (recname, sender, d_von, d_bis, aktiv, recurr, prev)) + sqlRun("UPDATE records SET recname=?, cid=?, rvon=?, rbis=?, renabled=?, rmask=? WHERE rowid=?", (recname, sender, d_von, d_bis, aktiv, recurr, prev)) setRecords() @@ -940,7 +938,7 @@ def doRecord(self): ffargs = config.cfg_ffmpeg_params ffargs = ffargs.split() if streamtype in fftypes: - delta = total(tDiff(self.bis, datetime.now())) + delta = total(tDiff(self.bis, datetime.now())) deltasec = '%d' % delta attr = [config.cfg_ffmpeg_path,"-i", self.url, '-y', '-loglevel', 'fatal', '-t', deltasec] + ffargs + [fn] print ("FFMPEG (%s) record '%s' called with:" % (streamtype, self.name)) @@ -965,7 +963,7 @@ def doRecord(self): u = urllib32.urlopen(self.url) try: f = open(fn, 'wb') - except: + except: f = open(fn.encode('utf-8').decode(sys.getfilesystemencoding()), 'wb') except urllib32.URLError: print ("Stream could not be parsed (URL=%s), aborting..." % (self.url)) @@ -982,7 +980,7 @@ def doRecord(self): f.close() print ("Record: '%s' ended" % (self.name)) if self in records: records.remove(self) - # 2015-01-21 Fail & recurrency check + # 2015-01-21 Fail & recurrency check if datetime.now() < self.bis - timedelta(seconds=10) and self.stopflag==0: print ("Something went wrong with '%s', retry in 10 seconds" % (self.name)) @@ -1002,7 +1000,7 @@ def stop(self): def cleanProcess(self): try: if not self.process==None: - self.process.terminate() + self.process.terminate() sleep(3) if not self.process==None: self.process.kill() diff --git a/xmltv.py b/xmltv.py index b95c858..921ebd2 100644 --- a/xmltv.py +++ b/xmltv.py @@ -49,12 +49,12 @@ def getFirst(stri, attr): def getOne(stri, attr, start=0): ret = "" - p1 = stri.find('<'+attr, start) + p1 = stri.find('<'+attr, start) p3 = 0 if p1 != -1: p1 = p1 + len(attr) + 1 - p2 = stri.find('>', p1) + 1 - p3 = stri.find('', p1) + 1 + p3 = stri.find('', p1) + 1 - p3 = stri.find('', p1) + 1 + p3 = stri.find('0: totalentries = getProg(stri, channellist) - del (stri) + del (stri) print ("XMLTV import completed with %s entries" % totalentries) return - + def getProg(strp, channellist=[]): deltaxmltv_txt = config.cfg_xmltvtimeshift @@ -157,10 +157,10 @@ def getProg(strp, channellist=[]): deltaxmltv = timedelta(hours=float(config.cfg_xmltvtimeshift)) except: deltaxmltv = timedelta(hours=0) - + sqllist = [] - - for attr,innertxt in getList(strp, 'programme'): + + for attr,innertxt in getList(strp, 'programme'): dt1 = datetime.strptime(getAttr(attr, "start")[0:14],"%Y%m%d%H%M%S") + deltaxmltv dt2 = datetime.strptime(getAttr(attr, "stop")[0:14],"%Y%m%d%H%M%S") + deltaxmltv p_id = getAttr(attr, "channel") @@ -177,11 +177,11 @@ def getProg(strp, channellist=[]): desc = epin + ". " break tmpdesc = getFirst(innertxt, 'desc') - desc = desc + tmpdesc + desc = desc + tmpdesc sqllist.append([p_id, title, datetime.strftime(dt1, "%Y-%m-%d %H:%M:%S"), datetime.strftime(dt2, "%Y-%m-%d %H:%M:%S"), desc]) sqlRun("INSERT OR IGNORE INTO guide VALUES (?, ?, ?, ?, ?)", sqllist, 1) return len(sqllist) - + def getLocalFile(file_in): print ("Trying to open a local XMLTV file: %s" % (file_in)) with open(file_in, 'r') as content_file: @@ -194,9 +194,9 @@ def getLocalFile(file_in): return out def getFile(file_in, override=0, ver=""): - rows=sqlRun("SELECT * FROM caching WHERE url='%s'" % file_in) + rows=sqlRun("SELECT * FROM caching WHERE url=?", (file_in, )) lastmod = "" - etag = "" + etag = "" out = "" if rows: lastmod = rows[0][2] @@ -207,20 +207,20 @@ def getFile(file_in, override=0, ver=""): request.add_header('User-Agent', 'tvstreamrecord/' + ver) if override==0: request.add_header('If-Modified-Since', lastmod) - request.add_header('If-None-Match', etag) + request.add_header('If-None-Match', etag) opener = urllib32.build_opener() try: hresponse = opener.open(request, timeout=10) - except Exception as ex: + except Exception as ex: print ("XMLTV Warning: connection timeout detected, retry in 5 seconds") sleep (5) hresponse = opener.open(request, timeout=20) feeddata = hresponse.read() - hr = hresponse.info() + hr = hresponse.info() lastmod = hr.get('Last-Modified') etag = hr.get('ETag') if rows and lastmod and etag: - sqlRun("UPDATE caching SET crTime=datetime('now', 'localtime'), Last_Modified=?, ETag=? WHERE url='%s'" % file_in, (lastmod, etag)) + sqlRun("UPDATE caching SET crTime=datetime('now', 'localtime'), Last_Modified=?, ETag=? WHERE url=?", (lastmod, etag, file_in)) elif lastmod and etag: sqlRun("INSERT INTO caching VALUES (datetime('now', 'localtime'), ?, ?, ?)", (file_in, lastmod, etag)) try: @@ -231,13 +231,13 @@ def getFile(file_in, override=0, ver=""): print ("XMLTV: reading URL %s with %s bytes" % (file_in, len(out))) if not b"" in out[-1000:]: print ("Possibly corrupted XML file, attempting to repair...") - pos = out.rfind(b"") + pos = out.rfind(b"") if pos != -1: out = out[:pos+12] + b"" - else: + else: pos = out.rfind(b"") if pos != -1: - out = out[:pos+10] + b"" + out = out[:pos+10] + b"" except Exception as ex: print ("XMLTV: no new data / unknown error, try again later (%s)" % file_in) pass @@ -246,12 +246,12 @@ def getFile(file_in, override=0, ver=""): out = out.decode("UTF-8") except: pass - + return out def main(argv=None): getProgList('debug') return - + if __name__ == "__main__": exit(main()) \ No newline at end of file