OSDN Git Service

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