OSDN Git Service

2407d6cd993f8f75bb8d5408b48731b2293e3976
[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 rec10web_dbSQLite
9 import os
10 import re
11 import datetime
12 import rec10web_dbSQLite
13 import ConfigParser
14 import time
15 cgitb.enable()
16 path = str(os.path.dirname(os.path.abspath(__file__))) + "/"
17 confp = ConfigParser.SafeConfigParser()
18 Conf = 'config.ini'
19 confp.read(path + Conf)
20 global f
21 f = cgi.FieldStorage()
22 def getpath(string):
23     global confp
24     return confp.get('path', string)
25 def getdbpath(string):
26     global confp
27     return confp.get('db', string)
28 def getdb():
29     retdb = ""
30     if getdbpath('db') == 'MySQL':
31         dbn = getdbpath("mysql_dbname")
32         dbh = getdbpath("mysql_host")
33         dbu = getdbpath("mysql_user")
34         dbpwd = getdbpath("mysql_passwd")
35         dbport = int(getdbpath("mysql_port"))
36         retdb = rec10web_dbMySQL.DB_MySQL(dbname=dbn, host=dbh, user=dbu, passwd=dbpwd, port=dbport)
37     else:
38         retdb = rec10web_dbSQLite.DB_SQLite(dbpath)
39     return retdb
40 def getRecDate():
41     dl = database.select_all_rectime()
42     recdata = "id,type,chtxt,title,btime,etime,deltaday,opt\n"
43     #print dl
44     for d in dl:
45         id = d['id']
46         typet = d['type']
47         chtxt = d['chtxt']
48         title = d['title']
49         btime = d['btime']
50         etime = d['etime']
51         deltatime = d['deltatime']
52         deltaday = d['deltaday']
53         opt = d['opt']
54         if deltaday == None:
55             deltaday = "なし"
56         elif deltaday == "":
57             deltaday = "なし"
58         if opt == None:
59             opt = "なし"
60         if typet == "res":
61             typet = "一回予約"
62         elif typet == "key":
63             typet = "検索予約"
64         elif typet == "keyevery":
65             typet = "隔週予約"
66         elif typet == "res":
67             typet = "録画最終"
68         elif typet == "grid":
69             typet = "外部委託"
70         elif typet == "ts2avi":
71             typet = "縁故予約"
72         elif typet == "b252ts":
73             typet = "復号予約"
74         #print btime
75         btime = btime[5:16]
76         etime = etime[5:16]
77         btime = btime.replace("-", "/")
78         etime = etime.replace("-", "/")
79         if btime[0:5] == etime[0:5]:
80             etime = etime[6:]
81         s = "\"" + str(id) + "\",\"" + typet + "\",\"" + chtxt + "\",\"" + title + "\",\"" + btime + "\",\"" + etime + "\",\"" + deltaday + "\",\"" + opt + "\"\n"
82         s = str(id) + "," + typet + "," + chtxt + "," + title + "," + btime + "," + etime + "," + deltaday + "," + opt + "\n"
83         recdata = recdata + s
84     f = open(path + "/recdatum.csv", "w")
85     f.write(recdata)
86     f.close()
87 def getiEPGDate():
88     dl = database.select_all_iepg()
89     recdata = "id,name,chtxt\n"
90     #print dl
91     s = ""
92     for d in dl:
93         s = s + d[0] + "," + d[1] + "," + d[2] + "\n"
94     recdata = recdata + s
95     f = open(path + "/iepgdatum.csv", "w")
96     f.write(recdata)
97     f.close()
98 def getchtxt():
99     dl = database.select_all_chdata()
100     chopt = ""
101     for bctype, ontv, chtxt, ch, csch, updatetime in dl:
102         chdisplay = ""
103         for bctype, channel, display in database.select_by_ontv_ch(ontv):
104             chdisplay = display
105         if chdisplay != "":
106             chopt = chopt + "<option  value=" + chtxt + ">" + chdisplay + "</option>\n                "
107     return chopt
108 def edit_date(id):
109     ret = database.select_by_id_rectime(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_chdata(chtxt)
136     for bctypet, ontvt, chtxtt, cht, cscht, updatetimet in bctypegetdb:
137         bctype = bctypet
138     if (type == "rec") or (type == "res") or (type == "key") or (type == "keyevery"):
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_rectime(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_rectime(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_rectime(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_chdata(chtxt):
206         bctype = dl[0]
207     if (type == "rec") or (type == "res") or (type == "key") or (type == "keyevery"):
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_rectime(id)
216         database.add_rectime(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 = "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 = "epgデータを削除しました。"
277     u = "rec10web.py?exec=iepg-show"
278     return get_fin(s, u)
279 def mode_iepg_del_miss():
280     s = "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 = "予約が終了しました。移動します。"
288     u = "rec10web.py?exec=schedule"
289     return get_fin(s, u)
290 def mode_recover():
291     s = "最大予約可能数を超えています"
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 = "予約を削除しました。"
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 = "res"
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_rectime(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