OSDN Git Service

b12e0cbcf3b67f53b4afedba3540b5507195ff87
[rec10/rec10-git.git] / Rec10WEB / trunk / src / rec10web.py
1 #!/usr/bin/python
2 # coding: UTF-8
3 # Rec10 TS Recording Tools
4 # Copyright (C) 2009 Yukikaze
5 import cgi
6 import cgitb
7 import rec10web_dbMySQL
8 import os
9 import os.path
10 import re
11 import datetime
12 import ConfigParser
13 import time
14 cgitb.enable()
15 path = str(os.path.dirname(os.path.abspath(__file__))) + "/"
16 confp = ConfigParser.SafeConfigParser()
17 Conf = 'rec10.conf'
18 cpath=""
19 if (os.path.exists(os.path.join(path,Conf))):
20     cpath=os.path.join(path,Conf)
21 elif (os.path.exists(os.path.join("/etc/rec10",Conf))):
22     cpath=os.path.join("/etc/rec10",Conf)
23 elif (os.path.exists(os.path.join("/etc",Conf))):
24     cpath=os.path.join("/etc",Conf)
25 confp.read(cpath)
26 global f
27 f = cgi.FieldStorage()
28 def getpath(string):
29     global confp
30     return confp.get('path', string)
31 def getdbpath(string):
32     global confp
33     return confp.get('db', string)
34 def getdb():
35     retdb = ""
36     if getdbpath('db') == 'MySQL':
37         dbn = getdbpath("mysql_dbname")
38         dbh = getdbpath("mysql_host")
39         dbu = getdbpath("mysql_user")
40         dbpwd = getdbpath("mysql_passwd")
41         dbport = int(getdbpath("mysql_port"))
42         retdb = rec10web_dbMySQL.DB_MySQL(dbname=dbn, host=dbh, user=dbu, passwd=dbpwd, port=dbport)
43     return retdb
44 def getRecDate():
45     dl = database.select_all_timeline()
46     recdata = "id,type,chtxt,title,btime,etime,deltaday,opt\n"
47     #print dl
48     for d in dl:
49         id = d['id']
50         typet = d['type']
51         chtxt = d['chtxt']
52         title = d['title']
53         btime = d['btime']
54         etime = d['etime']
55         deltatime = d['deltatime']
56         deltaday = d['deltaday']
57         opt = d['opt']
58         if deltaday == None:
59             deltaday = u"なし"
60         elif deltaday == "":
61             deltaday = u"なし"
62         if opt == None:
63             opt = u"なし"
64         if typet == "reserve_flexible":
65             typet = u"浮動予約"
66         elif typet == "search_today":
67             typet = u"当日予約"
68         elif typet == "search_everyday":
69             typet = u"隔日予約"
70         elif typet == "reserve_fixed":
71             typet = u"確定予約"
72         elif typet == "grid":
73             typet = u"外部委託"
74         elif typet == "convert_ts_mp4":
75             typet = u"縁故予約"
76         elif typet == "convert_b25_ts":
77             typet = u"解読予約"
78         #print btime
79         btime = btime[5:16]
80         etime = etime[5:16]
81         btime = btime.replace("-", "/")
82         etime = etime.replace("-", "/")
83         if btime[0:5] == etime[0:5]:
84             etime = etime[6:]
85         s = "\"" + str(id) + "\",\"" + typet + "\",\"" + chtxt + "\",\"" + title + "\",\"" + btime + "\",\"" + etime + "\",\"" + deltaday + "\",\"" + opt + "\"\n"
86         s = str(id) + "," + typet + "," + chtxt + "," + title + "," + btime + "," + etime + "," + deltaday + "," + opt + "\n"
87         recdata = recdata + s
88     f = open(path + "/recdatum.csv", "w")
89     f.write(recdata)
90     f.close()
91 def getiEPGDate():
92     dl = database.select_all_iepg()
93     recdata = "id,name,chtxt\n"
94     #print dl
95     s = ""
96     for d in dl:
97         s = s + d[0] + "," + d[1] + "," + d[2] + "\n"
98     recdata = recdata + s
99     f = open(path + "/iepgdatum.csv", "w")
100     f.write(recdata)
101     f.close()
102 def getchtxt():
103     dl = database.select_all_epg_ch()
104     chopt = ""
105     for bctype, ontv, chtxt, chname, ch, csch, updatetime in dl:
106         chopt = chopt + "<option  value=" + chtxt + ">" + chname + "</option>\n                "
107     return chopt
108 def edit_date(id):
109     ret = database.select_by_id_timeline(id)
110     return ret[0]
111 def reserv_recday(keyword, chtxt, btime, etime, deltatime, opt, deltaday, day):
112     """
113     dayは月曜日を1日曜日を7とした数字
114     """
115     #bt=datetime.datetime.strptime(btime,"%Y-%m-%d %H:%M:%S")
116     #et=datetime.datetime.strptime(etime,"%Y-%m-%d %H:%M:%S")
117     bt = datetime.datetime(*time.strptime(btime, "%Y-%m-%d %H:%M:%S")[:-3])
118     et = datetime.datetime(*time.strptime(etime, "%Y-%m-%d %H:%M:%S")[:-3])
119     dt = int(day)-bt.isoweekday()
120     if dt < 0:
121         dt = dt + 7
122     dbt = bt + datetime.timedelta(days=dt)
123     det = et + datetime.timedelta(days=dt)
124     btime = dbt.strftime("%Y-%m-%d %H:%M:%S")
125     etime = det.strftime("%Y-%m-%d %H:%M:%S")
126     return reserv("keyevery", keyword, chtxt, btime, etime, deltatime, opt, "7")
127 def reserv(type, keyword, chtxt, btime, etime, deltatime, opt, deltaday):
128     MaxT = 2
129     MaxS = 2
130     tsnum = count_schedule(btime, etime)
131     MaxT = MaxT-tsnum[0]
132     MaxS = MaxS-tsnum[1]
133     bctype = ""
134     rett = ""
135     bctypegetdb = database.select_by_chtxt_epg_ch(chtxt)
136     for bctypet, ontvt, chtxtt, cht, cscht, updatetimet in bctypegetdb:
137         bctype = bctypet
138     if (type == "reserve_fixed") or (type == "reserve_flexible") or (type == "search_today") or (type == "search_everyday"):
139         if bctype.find("cs") > -1:
140             MaxS = MaxS-1
141         elif bctype.find("bs") > -1:
142             MaxS = MaxS-1
143         elif bctype.find("te") > -1:
144             MaxT = MaxT-1
145     if MaxS > -1 and MaxT > -1:
146         database.add_timeline(type=type, chtxt=chtxt, title=keyword, btime=btime, etime=etime, deltatime=deltatime, deltaday=deltaday, opt=opt)
147         rett = ""
148     else:
149         rett = "over"
150     return rett
151 def count_schedule(btime, etime):
152     """
153     return rec num (int return[0]:TE /int return[1]:BS/CS)
154     """
155     def cmpare(x, y):
156         #xt=datetime.datetime(*time.strptime(x,"%Y-%m-%d %H:%M:%S")[:-3])
157         #yt=datetime.datetime(*time.strptime(y,"%Y-%m-%d %H:%M:%S")[:-3])
158         xt = x
159         yt = y
160         if xt > yt:
161             return -1
162         elif xt == yt:
163             return 0
164         else:
165             return 1
166     dls = database.schedule_timeline(btime, etime)
167     times = []
168     btd = datetime.datetime(*time.strptime(btime, "%Y-%m-%d %H:%M:%S")[:-3])
169     etd = datetime.datetime(*time.strptime(etime, "%Y-%m-%d %H:%M:%S")[:-3])
170     for dl in dls:
171         dd1 = datetime.datetime(*time.strptime(dl[4], "%Y-%m-%d %H:%M:%S")[:-3])
172         dd2 = datetime.datetime(*time.strptime(dl[5], "%Y-%m-%d %H:%M:%S")[:-3])
173         if dd1 < btd:
174             dd1 = btd
175         if dd2 > etd:
176             dd2 = etd
177         times.append(dd1)
178         times.append(dd2)
179     times = list(set(times))
180     times.sort(cmpare)
181     times.reverse()
182     retcount = [0, 0]
183     for i in xrange(0, len(times)-2, 1):
184         bt1 = times[i]
185         et1 = times[i + 1]
186         btime1 = bt1.strftime("%Y-%m-%d %H:%M:%S")
187         etime1 = et1.strftime("%Y-%m-%d %H:%M:%S")
188         ret1 = database.count_schedule_timeline(btime1, etime1)
189         if retcount[0] < ret1[0]:
190             retcount[0] = ret1[0]
191         if retcount[1] < ret1[1]:
192             retcount[1] = ret1[1]
193     return retcount
194 def change_reserv(id, type, keyword, chtxt, btime, etime, deltatime, opt, deltaday):
195     """
196     idはテキスト
197     """
198     MaxT = 2
199     MaxS = 2
200     tsnum = count_schedule(btime, etime)
201     MaxT = MaxT-tsnum[0]
202     MaxS = MaxS-tsnum[1]
203     bctype = ""
204     rett = ""
205     for dl in database.select_by_chtxt_epg_ch(chtxt):
206         bctype = dl[0]
207     if (type == "reserve_fixed") or (type == "reserve_flexible") or (type == "search_today") or (type == "search_everyday"):
208         if bctype.find("cs") > -1:
209             MaxS = MaxS-1
210         elif bctype.find("bs") > -1:
211             MaxS = MaxS-1
212         elif bctype.find("te") > -1:
213             MaxT = MaxT-1
214     if MaxS > -1 and MaxT > -1:
215         database.del_by_id_timeline(id)
216         database.add_timeline(type=type, chtxt=chtxt, title=keyword, btime=btime, etime=etime, deltatime=deltatime, deltaday=deltaday, opt=opt)
217     else:
218         rett = "over"
219     return rett
220 def station2chtxt(station):
221     ret = ""
222     #try:
223     database.new_iepg()
224     #except:
225     #    ""
226     sta = database.select_by_station_iepg(station)
227     if len(sta) > 0:
228         ret = sta[0][2]
229     else:
230         ret = "n\/a"
231     return ret
232 def readHtmlSrcSimple():
233     f = open(path + 'rswi.htm')
234     ret = f.read()
235     f.close()
236     return ret
237 def readRecFinisSimple():
238     f = open(path + 'fin.htm')
239     ret = f.read()
240     f.close()
241     return ret
242 def readRecSchedule():
243     f = open(path + 'schedule.htm')
244     ret = f.read()
245     f.close()
246     return ret
247 def readiEPGadd():
248     f = open(path + 'iepg_add.htm')
249     ret = f.read()
250     f.close()
251     return ret
252 def readiEPGshow():
253     f = open(path + 'iepg_show.htm')
254     ret = f.read()
255     f.close()
256     return ret
257 def get_fin(string, refreshurl):
258     htmdate = readRecFinisSimple()
259     htmdate = htmdate.replace('<!--text_for_replace_fin//-->', string)
260     htmdate = htmdate.replace('<!--url_for_replace_fin//-->', refreshurl)
261     return htmdate
262 def mode_iepg_add(station):
263     htmdate = readiEPGadd()
264     htmdate = htmdate.replace("<!--text_for_replace_chtxt_input//-->", getchtxt())
265     htmdate = htmdate.replace("<!--ch-value//-->", "")
266     htmdate = htmdate.replace("<!--iepg_title-value//-->", station)
267     return htmdate
268 def mode_iepg_fin():
269     s = u"epgデータの追加を完了しました。<br>\n録画を行う場合はもう一度おねがいします。<br>"
270     u = "rec10web.py?exec=iepg-show"
271     return get_fin(s, u)
272 def mode_iepg_show():
273     htmdate = readiEPGshow()
274     return htmdate
275 def mode_iepg_del():
276     s = u"epgデータを削除しました。"
277     u = "rec10web.py?exec=iepg-show"
278     return get_fin(s, u)
279 def mode_iepg_del_miss():
280     s = u"epgデータの削除に失敗しました。"
281     u = "rec10web.py?exec=iepg-show"
282     return get_fin(s, u)
283 def mode_schedule():
284     htmdate = readRecSchedule()
285     return htmdate
286 def mode_recfin():
287     s = u"予約が終了しました。移動します。"
288     u = "rec10web.py?exec=schedule"
289     return get_fin(s, u)
290 def mode_recover():
291     s = u"最大予約可能数を超えています"
292     u = "rec10web.py?exec=schedule"
293     return get_fin(s, u)
294 def mode_normal():
295     htmdate = readHtmlSrcSimple()
296     htmdate = htmdate.replace("<!--exec-value//-->", "yes")
297     return htmdate
298 def mode_del():
299     s = u"予約を削除しました。"
300     u = "rec10web.py?exec=schedule"
301     return get_fin(s, u)
302 def mode_edit_rec10web(tasknum):
303     #editnum=exect.replace("edit:","")
304     htmdate = readHtmlSrcSimple()
305     iddata = edit_date(tasknum)
306     htmdate = htmdate.replace("<!--text_for_replace_chtxt_input//-->", getchtxt())
307     htmdate = htmdate.replace("<!--ch-value//-->", iddata['chtxt'])
308     htmdate = htmdate.replace("<!--btime-value//-->", iddata['btime'])
309     htmdate = htmdate.replace("<!--etime-value//-->", iddata['etime'])
310     htmdate = htmdate.replace("<!--type-value//-->", iddata['type'])
311     htmdate = htmdate.replace("<!--ch-value//-->", iddata['chtxt'])
312     htmdate = htmdate.replace("<!--title-value//-->", iddata['title'])
313     htmdate = htmdate.replace("<!--size-value//-->", size)
314     htmdate = htmdate.replace("<!--opts-value//-->", iddata["opt"])
315     htmdate = htmdate.replace("<!--exec-value//-->", "edit-exec:" + tasknum)
316     return htmdate
317 def mode_edit():
318     editnum = exect.replace("edit:", "")
319     htmdate = readHtmlSrcSimple()
320     iddata = edit_date(editnum)
321     htmdate = htmdate.replace("<!--text_for_replace_chtxt_input//-->", getchtxt())
322     htmdate = htmdate.replace("<!--ch-value//-->", iddata['chtxt'])
323     htmdate = htmdate.replace("<!--btime-value//-->", iddata['btime'])
324     htmdate = htmdate.replace("<!--etime-value//-->", iddata['etime'])
325     htmdate = htmdate.replace("<!--type-value//-->", iddata['type'])
326     htmdate = htmdate.replace("<!--ch-value//-->", iddata['chtxt'])
327     htmdate = htmdate.replace("<!--title-value//-->", iddata['title'])
328     htmdate = htmdate.replace("<!--size-value//-->", size)
329     htmdate = htmdate.replace("<!--opts-value//-->", iddata["opt"])
330     htmdate = htmdate.replace("<!--exec-value//-->", "edit-exec:" + editnum)
331     return htmdate
332 dbpath = path + "ch.db"
333 database = getdb()
334 btime = ""
335 etime = ""
336 title = ""
337 chtxt = ""
338 type = "reserve_flexible"
339 bt = ""
340 station_name = ""
341 mode = ""
342 ###ここからiEPG用の読み出し
343 if f.getfirst('station_name'):
344     station = f.getfirst('station_name')
345     chtxt = station2chtxt(station)
346     if chtxt == "n\/a":
347         mode = "iepg-add"
348         station_name = station
349         exect = "iepg-add"
350 if f.getfirst('station'):
351     station = f.getfirst('station')
352     chtxt = station2chtxt(station)
353     if chtxt == "n\/a":
354         mode = "iepg-add"
355         station_name = station
356         exect = "iepg-add"
357 ###ここから外部からの読み出しの場合
358 if f.getfirst('type'):
359     type = f.getfirst('type')
360 if f.getfirst('title'):
361     title = f.getfirst('title')
362 if f.getfirst('chtxt'):
363     chtxt = f.getfirst('chtxt')
364 if f.getfirst('btime'):
365     btime = f.getfirst('btime')
366     bt = datetime.datetime(*time.strptime(btime, "%Y-%m-%d %H:%M:%S")[:-3])
367 if f.getfirst('etime'):
368     etime = f.getfirst('etime')
369     et = datetime.datetime(*time.strptime(etime, "%Y-%m-%d %H:%M:%S")[:-3])
370     if bt != "":
371         delt = et-bt
372         dt = delt.days * 24 * 60 * 60 + delt.seconds
373         if dt < 0:
374             dd = datetime.timedelta(days=1)
375             et = et + dd
376             etime = et.strftime("%Y-%m-%d %H:%M:%S")
377         if dt < -1 * 24 * 60 * 60:
378             d1 = datetime.datetime(bt.year, 0, 0)
379             d2 = datetime.datetime(bt.year + 1, 0, 0)
380             dd = d2-d1
381             et = et + dd
382             etime = et.strftime("%Y-%m-%d %H:%M:%S")
383 size = "S"
384 if f.getfirst('size'):
385     size = f.getfirst('size')
386 opts = ""
387 if f.getfirst('opts'):
388     opts = f.getfirst('opts')
389 deltahour = ""
390 if f.getfirst('deltahour', ""):
391     deltahour = f.getfirst('deltahour', "")
392 deltaday = ""
393 if f.getfirst('deltaday', ""):
394     deltaday = f.getfirst('deltaday', "")
395 exect = ""
396 if f.getfirst('exec', ""):
397     exect = f.getfirst('exec', "")
398 if exect == "schedule":
399     mode = "schedule"
400     getRecDate()
401 elif exect == "yes":
402     mode = "yes"
403 elif re.search('edit:', exect):
404     mode = "edit"
405 elif re.search('edit-exec:', exect):
406     mode = "edit-exec"
407 elif exect == "change":
408     mode = "edit-rec10"
409 elif exect == "del":
410     mode = "del"
411 elif exect == "iepg-add":
412     mode = "iepg-add"
413 elif exect == "iepg-show":
414     mode = "iepg-show"
415 elif exect == "iepg-add_yes":
416     mode = "iepg-add-yes"
417 elif exect == "iepg-del":
418     mode = "iepg-del"
419 htmdate = mode_normal()
420 htmdate = htmdate.replace("<!--text_for_replace_chtxt_input//-->", getchtxt())
421 htmdate = htmdate.replace("<!--btime-value//-->", btime)
422 htmdate = htmdate.replace("<!--etime-value//-->", etime)
423 htmdate = htmdate.replace("<!--type-value//-->", type)
424 htmdate = htmdate.replace("<!--ch-value//-->", chtxt)
425 htmdate = htmdate.replace("<!--title-value//-->", title)
426 htmdate = htmdate.replace("<!--size-value//-->", size)
427 htmdate = htmdate.replace("<!--opts-value//-->", opts)
428 #ここから曜日検索の設定
429 if f.getfirst('type') == "keyday":
430     rett = ""
431     dayt = f.getfirst('day_Mon')
432     if dayt:
433         rett = rett + reserv_recday(title, chtxt, btime, etime, deltahour, opts, deltaday, dayt)
434     dayt = f.getfirst('day_Tue')
435     if dayt:
436         rett = rett + reserv_recday(title, chtxt, btime, etime, deltahour, opts, deltaday, dayt)
437     dayt = f.getfirst('day_Wed')
438     if dayt:
439         rett = rett + reserv_recday(title, chtxt, btime, etime, deltahour, opts, deltaday, dayt)
440     dayt = f.getfirst('day_Thu')
441     if dayt:
442         rett = rett + reserv_recday(title, chtxt, btime, etime, deltahour, opts, deltaday, dayt)
443     dayt = f.getfirst('day_Fri')
444     if dayt:
445         rett = rett + reserv_recday(title, chtxt, btime, etime, deltahour, opts, deltaday, dayt)
446     dayt = f.getfirst('day_Sat')
447     if dayt:
448         rett = rett + reserv_recday(title, chtxt, btime, etime, deltahour, opts, deltaday, dayt)
449     dayt = f.getfirst('day_Sun')
450     if dayt:
451         rett = rett + reserv_recday(title, chtxt, btime, etime, deltahour, opts, deltaday, dayt)
452     if rett == "":
453         htmdate = mode_recfin()
454     else:
455         htmdate = mode_recover()
456     chtxt = ""
457     exect = ""
458
459
460 if mode == "schedule":
461     htmdate = mode_schedule()
462 elif mode == "edit":
463     htmdate = mode_edit()
464 elif mode == "iepg-add":
465     htmdate = mode_iepg_add(station_name)
466 elif mode == "iepg-add-yes":
467     try:
468         database.new_iepg()
469     except:
470         ""
471     if f.getfirst('iepg_station') and f.getfirst('iepg_chtxt'):
472         database.add_iepg(f.getfirst('iepg_station'), f.getfirst('iepg_chtxt'))
473     htmdate = mode_iepg_fin()
474 elif mode == "iepg-show":
475     getiEPGDate()
476     htmdate = mode_iepg_show()
477 elif mode == "iepg-del":
478     s = f.getfirst('iepgdelnum')
479     htmdate = ""
480     #try:
481     for st in s.split(","):
482         if st != "":
483             database.del_by_id_iepg(st)
484     htmdate = mode_iepg_del()
485     #except:
486     #    htmdate=mode_iepg_del_miss()
487 elif mode == "edit-rec10":
488     s = f.getfirst('tasknum')
489     s.replace(" ", "")
490     htmdate = mode_edit_rec10web(s.split(",")[0])
491 elif mode == "del":
492     s = f.getfirst('tasknum')
493     s.replace(" ", "")
494     ss = s.split(",")
495     for st in ss:
496         if st != "":
497             database.del_by_id_timeline(st)
498     htmdate = mode_del()
499 elif mode == "edit-exec":
500     if (chtxt != "")and(title != "")and(btime != "")and(etime != "")and(opts != ""):
501         editnum = exect.replace("edit-exec:", "")
502         restxt = change_reserv(editnum, type, title, chtxt, btime, etime, deltahour, opts, deltaday)
503         if restxt == "":
504             htmdate = mode_recfin()
505         elif restxt == "over":
506             htmdate = mode_recover()
507         else:
508             htmdate = mode_recfin()
509     exect = ""
510 elif mode == "yes":
511     if (chtxt != "")and(title != "")and(btime != "")and(etime != "")and(opts != ""):
512         restxt = reserv(type, title, chtxt, btime, etime, deltahour, opts, deltaday)
513         if restxt == "":
514             htmdate = mode_recfin()
515         elif restxt == "over":
516             htmdate = mode_recover()
517         else:
518             htmdate = mode_recfin()
519 print "Content-Type: text/html"
520 print htmdate.encode('utf-8')