3 # Rec10 TS Recording Tools
4 # Copyright (C) 2009 Yukikaze
7 from decimal import Decimal
14 def __init__(self, dbname, user, passwd, host="localhost", port=3306):
18 self.dbpasswd = passwd
21 con = MySQLdb.connect(user=user, passwd=passwd)
23 cur.execute('CREATE DATABASE ' + dbname + " DEFAULT CHARACTER SET utf8")
28 db = self.connect_db()
31 CREATE TABLE timeline \
33 id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,\
39 deltatime VARCHAR(5),\
42 UNIQUE uni (type,chtxt,title,btime,deltaday)\
47 self.new_epg_timeline("")
48 self.new_in_timeline_log()
49 self.new_in_auto_bayes_key()
50 self.new_in_auto_jbk_key()
52 self.new_auto_timeline_bayes()
53 self.new_auto_timeline_keyword()
54 self.new_auto_proc_tmp()
59 con = MySQLdb.connect(db=self.dbname, host=self.dbhost, port=self.dbport, user=self.dbusr, passwd=self.dbpasswd, charset="utf8")
61 cur.execute('set names utf8;')
63 def close_db(self, db):
67 db = self.connect_db()
69 db[1].execute('drop table epg_ch')
77 ontv VARCHAR(30) PRIMARY KEY,\
89 def add_epg_ch(self, bctype, ontv, chtxt, ch, csch, updatetime):
90 db = self.connect_db()
93 VALUES (%s,%s,%s,%s,%s,"",%s,%s,%s)', \
94 (bctype, ontv, chtxt, ch, csch, updatetime, "1","1"))
96 def select_by_ontv_epg_ch(self, ontv):
97 db = self.connect_db()
98 dbexe = db[1].execute("\
99 SELECT bctype,ontv,chtxt,ch,csch,updatetime \
106 dls = db[1].fetchall()
110 r[5] = r[5].strftime("%Y-%m-%d %H:%M:%S")
113 def select_by_chtxt_epg_ch(self, chtxt):
114 db = self.connect_db()
115 dbexe = db[1].execute("\
116 SELECT bctype,ontv,chtxt,ch,csch,updatetime \
123 dls = db[1].fetchall()
127 r[5] = r[5].strftime("%Y-%m-%d %H:%M:%S")
130 def select_by_bctype_epg_ch(self, bctype):
131 db = self.connect_db()
132 dbexe = db[1].execute("\
133 SELECT bctype,ontv,chtxt,ch,csch,updatetime,status \
135 WHERE bctype = %s", \
140 dls = db[1].fetchall()
143 #recdblist.printutf8(dl)
145 r[5] = r[5].strftime("%Y-%m-%d %H:%M:%S")
149 def select_by_ch_epg_ch(self, ch):
150 db = self.connect_db()
151 dbexe = db[1].execute("\
153 bctype,ontv,chtxt,ch,csch,updatetime \
160 dls = db[1].fetchall()
164 r[5] = r[5].strftime("%Y-%m-%d %H:%M:%S")
167 def select_all_epg_ch(self):
168 db = self.connect_db()
169 dbexe = db[1].execute("\
170 SELECT bctype,ontv,chtxt,ch,csch,updatetime \
176 dls = db[1].fetchall()
180 r[5] = r[5].strftime("%Y-%m-%d %H:%M:%S")
183 def set_new_status(self,dhour):
184 db = self.connect_db()
185 dbexe = db[1].execute("UPDATE epg_ch \
189 updatetime < DATE_SUB(now(),INTERVAL " + dhour + " HOUR) \
194 def select_get_update_epg_ch(self, dhour):
195 db = self.connect_db()
196 dbexe = db[1].execute("SELECT bctype,chtxt,status FROM epg_ch \
199 updatetime < DATE_SUB(now(),INTERVAL " + dhour + " HOUR) \
205 ORDER BY status DESC")
207 #recdblist.printutf8(dbexe)
209 ret = db[1].fetchall()
212 def update_by_bctype_epg_ch(self, bctype):
213 db = self.connect_db()
219 WHERE bctype = %s", (bctype,))
221 def update_by_bctype_and_chtxt_epg_ch(self, bctype, chtxt):
222 db = self.connect_db()
228 WHERE bctype = %s AND chtxt = %s", (bctype, chtxt))
230 def update_status_by_bctype_epg_ch(self, bctype, status):
231 db = self.connect_db()
236 WHERE bctype = %s", \
240 def update_chname_by_ontv_epg_ch(self,ontv,chname):
241 db = self.connect_db()
250 def add_auto_proc_tmp(self,type,title,chtxt):
251 db = self.connect_db()
253 INSERT IGNORE into auto_proc_tmp \
255 values (%s,%s,%s)',(type,title,chtxt))
258 def new_auto_proc_tmp(self):
259 db = self.connect_db()
261 db[1].execute('drop table auto_proc_tmp')
266 CREATE TABLE auto_proc_tmp \
269 title VARCHAR(100) PRIMARY KEY,\
271 UNIQUE unibayeskey(title)\
276 def update_auto_proc(self):
277 db = self.connect_db()
280 INSERT INTO auto_proc SELECT * FROM auto_proc_tmp\
285 def new_auto_proc(self):
286 db = self.connect_db()
288 db[1].execute('drop table auto_proc')
293 CREATE TABLE auto_proc \
296 title VARCHAR(100) PRIMARY KEY,\
298 UNIQUE unibayeskey(title)\
303 def add_in_timeline_log(self , chtxt="", title="", btime="", etime="", opt="", exp="", longexp="", category=""):
304 db = self.connect_db()
306 INSERT IGNORE into in_timeline_log \
307 (chtxt,title,btime,etime,opt,exp,longexp,category) \
308 values (%s,%s,%s,%s,%s,%s,%s,%s)', \
309 ( chtxt, title, btime, etime, opt,exp,longexp,category))
312 def del_in_timeline_log(self, title="", chtxt="", btime=""):
316 db = self.connect_db()
318 DELETE FROM in_timeline_log \
319 WHERE title = %s AND chtxt = %s AND btime = %s", \
320 (title, chtxt, btime))
323 def new_in_timeline_log(self):
324 db = self.connect_db()
327 CREATE TABLE in_timeline_log \
329 id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,\
337 category VARCHAR(100),\
338 UNIQUE uni (chtxt,title,btime,category)\
343 def select_chtxt_by_title_timeline_log(self,title):
344 db = self.connect_db()
345 dbexe = db[1].execute("\
347 FROM in_timeline_log \
348 WHERE title LIKE \"%"+title+"%\"\
350 ORDER by sum(1) DESC limit 1")
351 retdb=db[1].fetchall()
358 def add_timeline(self, type="", chtxt="", title="", btime="", etime="", deltatime="", deltaday="", opt=""):
359 db = self.connect_db()
361 INSERT IGNORE into timeline \
362 (type,chtxt,title,btime,etime,deltatime,deltaday,opt) \
363 values (%s,%s,%s,%s,%s,%s,%s,%s)', \
364 (type, chtxt, title, btime, etime, deltatime, deltaday, opt))
367 def del_timeline(self, type="", title="", chtxt="", btime=""):
371 db = self.connect_db()
373 DELETE FROM timeline \
374 WHERE type = %s AND title = %s AND chtxt = %s AND btime = %s", \
375 (type, title, chtxt, btime))
378 def select_all_timeline(self):
379 db = self.connect_db()
381 dbr = db[1].execute("\
382 SELECT type, chtxt, title, btime, etime, deltatime ,deltaday ,opt \
384 dbl = db[1].fetchall()
387 for typet, chtxt, title, btime, etime, deltatime, deltaday, opt in dbl:
392 btime = btime.strftime("%Y-%m-%d %H:%M:%S")
393 etime = etime.strftime("%Y-%m-%d %H:%M:%S")
397 ret['deltatime'] = ""
399 if deltatime == None:
404 ret['deltatime'] = deltatime
405 elif typet == 'keyevery':
406 ret['deltatime'] = deltatime
407 ret['deltaday'] = deltaday
411 def select_bytime_timeline(self, dminutes):
412 db = self.connect_db()
414 #dbr=db[1].execute("SELECT type, chtxt, title, btime, etime, deltatime ,deltaday ,opt FROM rectime WHERE btime < DATE_SUB(now(),INTERVAL "+dminutes+" MINUTE ) AND btime > DATE_ADD(now(),INTERVAL "+dminutes+" MINUTE )")
415 dbr = db[1].execute("SELECT \
416 type, chtxt, title, btime, etime, deltatime ,deltaday ,opt \
418 WHERE btime BETWEEN DATE_SUB(now(),INTERVAL " + dminutes + " MINUTE ) AND \
419 DATE_ADD(now(),INTERVAL " + dminutes + " MINUTE )")
420 dbl = db[1].fetchall()
422 #recdblist.printutf8(dbl)
424 for typet, chtxt, title, btime, etime, deltatime, deltaday, opt in dbl:
429 btime = btime.strftime("%Y-%m-%d %H:%M:%S")
430 etime = etime.strftime("%Y-%m-%d %H:%M:%S")
434 if deltatime == None or deltatime == "":
436 if deltaday == None or deltaday == "":
438 if typet == recdblist.REC_KEYWORD:
439 ret['deltatime'] = deltatime
440 elif typet == recdblist.REC_KEYWORD_EVERY_SOME_DAYS:
441 ret['deltatime'] = deltatime
442 ret['deltaday'] = deltaday
445 def select_bytime_all_timeline(self,btime,etime,chtxt):
446 db = self.connect_db()
448 #dbr=db[1].execute("SELECT type, chtxt, title, btime, etime, deltatime ,deltaday ,opt FROM rectime WHERE btime < DATE_SUB(now(),INTERVAL "+dminutes+" MINUTE ) AND btime > DATE_ADD(now(),INTERVAL "+dminutes+" MINUTE )")
449 dbr = db[1].execute("SELECT \
450 type, chtxt, title, btime, etime, deltatime ,deltaday ,opt \
452 WHERE btime > %s AND \
454 AND chtxt=%s ",(btime,etime,chtxt))
455 dbl = db[1].fetchall()
457 #recdblist.printutf8(dbl)
459 for typet, chtxt, title, btime, etime, deltatime, deltaday, opt in dbl:
464 btime = btime.strftime("%Y-%m-%d %H:%M:%S")
465 etime = etime.strftime("%Y-%m-%d %H:%M:%S")
469 if deltatime == None or deltatime == "":
471 if deltaday == None or deltaday == "":
473 if typet == recdblist.REC_KEYWORD:
474 ret['deltatime'] = deltatime
475 elif typet == recdblist.REC_KEYWORD_EVERY_SOME_DAYS:
476 ret['deltatime'] = deltatime
477 ret['deltaday'] = deltaday
480 def delete_old_timeline(self, dhour):
481 db = self.connect_db()
483 DELETE FROM timeline \
485 btime < DATE_SUB(now(),INTERVAL " + dhour + " HOUR )")
488 def new_in_auto_jbk_key(self):
489 db = self.connect_db()
492 CREATE TABLE in_auto_jbk_key \
494 id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,\
495 keyword VARCHAR(200),\
496 UNIQUE unijbk (keyword)\
501 def add_in_auto_jbk_key(self,key):
502 db = self.connect_db()
504 INSERT IGNORE into in_auto_jbk_key \
510 def select_all_in_auto_jbk_key(self):
511 db = self.connect_db()
512 dbexe = db[1].execute("\
514 FROM in_auto_jbk_key \
518 ret = db[1].fetchall()
521 def new_in_status(self):
522 db = self.connect_db()
525 CREATE TABLE in_status \
527 ts2avi TINYINT DEFAULT 0,\
528 terec TINYINT DEFAULT 0,\
529 bscsrec TINYINT DEFAULT 0,\
530 b252ts TINYINT DEFAULT 0,\
531 installed TINYINT DEFAULT 0\
533 db[1].execute("INSERT IGNORE into in_status VALUE (0,0,0,0,0)")
537 def select_all_in_status(self):
538 db = self.connect_db()
539 dbexe = db[1].execute("\
540 SELECT ts2avi,terec,bscsrec,b252ts \
546 dls = db[1].fetchall()
557 def change_ts2avi_in_status(self,i):
562 db = self.connect_db()
564 UPDATE in_status SET ts2avi=ts2avi+%s",i)
566 def change_terec_in_status(self,i):
571 db = self.connect_db()
573 UPDATE in_status SET terec=terec+%s",i)
575 def change_bscsrec_in_status(self,i):
580 db = self.connect_db()
582 UPDATE in_status SET bscsrec=bscsrec+%s",i)
584 def change_b252ts_in_status(self,i):
589 db = self.connect_db()
591 UPDATE in_status SET b252ts=b252ts+%s",i)
593 def select_installed_in_status(self):
594 db = self.connect_db()
595 dbexe = db[1].execute("\
596 SELECT ts2avi,terec,bscsrec,b252ts,installed \
602 dls = db[1].fetchall()
608 def change_installed_in_status(self):
612 db = self.connect_db()
614 UPDATE in_status SET installed=1")
616 def new_epg_timeline(self, bctype):
617 db = self.connect_db()
620 DELETE FROM epg_timeline \
621 WHERE bctype = %s", \
627 CREATE TABLE epg_timeline \
630 channel VARCHAR(100) NOT NULL,\
636 category VARCHAR(100),\
637 UNIQUE unitv(bctype,channel,start,stop,title)\
643 def add_epg_timeline(self, bctype, channel, start, stop, title, desc,longdesc, category):
644 db = self.connect_db()
646 INSERT IGNORE INTO epg_timeline \
647 VALUES (%s,%s,%s,%s,%s,%s,%s,%s)', \
648 (bctype, channel, start, stop, title, desc,longdesc,category))
651 def add_multi_epg_timeline(self, tvlists):
653 tvlists is (bctype,channel,start,stop,title,desc,longdesc,category) lists.
655 db = self.connect_db()
657 INSERT IGNORE INTO epg_timeline \
658 (bctype,channel,start,stop,title,exp,longexp,category) \
659 values(%s,%s,%s,%s,%s,%s,%s,%s)', \
662 def select_by_time_ngram_epg_timeline(self, btime, etime, chtxt):
663 db = self.connect_db()
666 epg_ch.chtxt,title,start,stop,exp,longexp,category \
669 WHERE epg_ch.ontv=epg_timeline.channel \
676 dbcmd = db[1].execute(dbexe, (btime, etime, chtxt))
679 retall = db[1].fetchall()
682 def select_by_time_keyword_auto_suggest_epg_timeline(self,keyword,btime,etime):
683 db = self.connect_db()
686 epg_ch.chtxt,title,start,stop,exp,longexp,category \
689 WHERE epg_ch.ontv=epg_timeline.channel \
696 ( title LIKE \'%%"+keyword+"%%\' ) \
698 ( exp LIKE \'%%"+keyword+"%%\' ) \
700 ( longexp LIKE \'%%"+keyword+"%%\' ) \
702 dbcmd = db[1].execute(dbexe,(btime, etime))
705 retall = db[1].fetchall()
708 def new_in_auto_bayes_key(self):
709 db = self.connect_db()
711 db[1].execute('CREATE TABLE in_auto_bayes_key \
713 keychar VARCHAR(10),\
715 ratio_rec DECIMAL(32,14),\
716 ratio_all DECIMAL(32,14),\
717 UNIQUE unibayeskey(keychar,chtxt)\
719 db[1].execute('CREATE INDEX keycharindex ON in_auto_bayes_key(keychar)')
724 def add_in_auto_bayes_key(self,key,chtxt,ratio_rec,ratio_all):
725 db = self.connect_db()
726 ratio_rec=str(ratio_rec)
727 ratio_all=str(ratio_all)
729 INSERT IGNORE INTO in_auto_bayes_key \
730 (keychar,chtxt,ratio_rec,ratio_all) \
731 values (%s,%s,%s,%s)',\
732 (key,chtxt,ratio_rec,ratio_all))
734 def add_num_in_auto_bayes_key(self,chtxt,add_rec_num,add_all_num):
735 db = self.connect_db()
736 add_rec_num=str(add_rec_num)
737 add_all_num=str(add_all_num)
739 UPDATE in_auto_bayes_key SET ratio_rec=CONVERT(ratio_rec+%s,DECIMAL(32,14)),ratio_all=CONVERT(ratio_all+%s,DECIMAL(32,14)) WHERE keychar=\"NUM\" AND chtxt=%s",\
740 (add_rec_num,add_all_num,chtxt))
742 def change_in_auto_bayes_key(self,key,chtxt,new_ratio_rec,new_ratio_all):
745 db = self.connect_db()
747 UPDATE in_auto_bayes_key SET ratio_rec=%s,ratio_all=%s WHERE keychar=%s AND chtxt=%s",(str(new_ratio_rec),str(new_ratio_all),key,chtxt)\
750 def change_ratio_all_reduce_in_auto_bayes_key(self,chtxt,beforenum,newnum):
751 beforenum=str(beforenum)
753 db = self.connect_db()
755 UPDATE in_auto_bayes_key SET ratio_all=CONVERT(ratio_all*%s/(%s+%s),DECIMAL(32,14)) WHERE chtxt=%s AND NOT (keychar=\"NUM\")",(beforenum,newnum,beforenum,chtxt)\
758 def change_ratio_all_in_auto_bayes_key(self,key,chtxt,beforenum,addnum):
759 db = self.connect_db()
761 beforenum=str(beforenum)
762 db[1].execute("INSERT INTO in_auto_bayes_key (keychar,chtxt,ratio_rec,ratio_all) \
763 VALUES (%s,%s,%s,%s)\
764 ON DUPLICATE KEY UPDATE \
765 ratio_all=CONVERT((ratio_all*%s+%s)/%s,DECIMAL(32,14))",(key,chtxt,"0",str(Decimal(addnum)/beforenumf),beforenum,chtxt,key))
767 def change_multi_ratio_all_in_auto_bayes_key(self,chtxt,beforenum,list):
769 list={key:addnum}のリスト
772 beforenum=str(beforenum)
773 db = self.connect_db()
774 for i,j in list.items():
775 retl=(i,chtxt,"0",str(Decimal(j)/beforenumf),beforenum,str(j),beforenum)
776 db[1].execute("INSERT INTO in_auto_bayes_key (keychar,chtxt,ratio_rec,ratio_all) \
777 VALUES (%s,%s,%s,%s)\
778 ON DUPLICATE KEY UPDATE \
779 ratio_all=CONVERT((ratio_all*%s+%s)/%s,DECIMAL(32,14))",retl)
781 def change_ratio_rec_reduce_in_auto_bayes_key(self,chtxt,beforenum,newnum):
782 beforenum=str(beforenum)
784 db = self.connect_db()
786 UPDATE in_auto_bayes_key SET ratio_rec=CONVERT(ratio_rec*%s/(%s+%s),DECIMAL(32,14)) WHERE chtxt=%s AND NOT (keychar=\"NUM\")",(beforenum,newnum,beforenum,chtxt)\
789 def change_ratio_rec_in_auto_bayes_key(self,key,chtxt,beforenum,addnum):
790 db = self.connect_db()
792 beforenum=str(beforenum)
793 db[1].execute("INSERT INTO in_auto_bayes_key (keychar,chtxt,ratio_rec,ratio_all) \
794 VALUES (%s,%s,%s,%s)\
795 ON DUPLICATE KEY UPDATE \
796 ratio_rec=CONVERT((ratio_rec*%s+%s)/%s,DECIMAL(32,14))",(key,chtxt,str(Decimal(addnum)/beforenumf),"0",beforenum,chtxt,key))
798 def change_multi_ratio_rec_in_auto_bayes_key(self,chtxt,beforenum,list):#self,key,chtxt,beforenum,addnum):
800 beforenum=str(beforenum)
801 db = self.connect_db()
802 for i,j in list.items():
803 retl=(i,chtxt,str(Decimal(j)/beforenumf),"0",beforenum,str(j),beforenum)
804 db[1].execute("INSERT INTO in_auto_bayes_key (keychar,chtxt,ratio_rec,ratio_all) \
805 VALUES (%s,%s,%s,%s)\
806 ON DUPLICATE KEY UPDATE \
807 ratio_rec=CONVERT((ratio_rec*%s+%s)/%s,DECIMAL(32,14))",retl)
809 def select_by_key_in_auto_bayes_key(self,key,chtxt):
810 db = self.connect_db()
811 dbexe = db[1].execute("\
812 SELECT keychar,chtxt,ratio_rec,ratio_all \
813 FROM in_auto_bayes_key \
814 WHERE keychar = %s AND chtxt = %s", \
818 dls = db[1].fetchall()
825 def new_auto_timeline_keyword(self):
826 db = self.connect_db()
829 CREATE TABLE auto_timeline_keyword \
831 id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,\
836 UNIQUE uni (chtxt,title,btime,etime)\
840 def add_auto_timeline_keyword(self,chtxt="", title="", btime="", etime=""):
841 db = self.connect_db()
843 INSERT IGNORE into auto_timeline_keyword \
844 (chtxt,title,btime,etime) \
845 values (%s,%s,%s,%s)', \
846 (chtxt, title, btime, etime))
849 def delete_old_auto_timeline_keyword(self, dhour):
850 db = self.connect_db()
852 DELETE FROM auto_timeline_keyword \
854 btime < DATE_SUB(now(),INTERVAL " + dhour + " HOUR )")
856 def new_auto_timeline_bayes(self):
857 db = self.connect_db()
860 CREATE TABLE auto_timeline_bayes \
862 id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,\
868 UNIQUE uni (chtxt,title,btime,etime)\
872 def add_auto_timeline_bayes(self,chtxt="", title="", btime="", etime="",point=""):
873 db = self.connect_db()
875 INSERT IGNORE into auto_timeline_bayes \
876 (chtxt,title,btime,etime,point) \
877 values (%s,%s,%s,%s,%s)', \
878 (chtxt, title, btime, etime,point))
880 def delete_old_auto_timeline_bayes(self, dhour):
881 db = self.connect_db()
883 DELETE FROM auto_timeline_bayes \
885 btime < DATE_SUB(now(),INTERVAL " + dhour + " HOUR )")