def __init__(self, databasePath, systemDatabasePath, logging): """ databasePath: database file path systemDatabasePath: system database file path logging: log function """ self.databasePath = databasePath self.systemDatabasePath = systemDatabasePath #self.logging = logging self._wtime_load = 60 * 60 * 12 # wait times self._wtime_scan = 60 * 60 * 12 self._wtime_rss = 60 * 60 * 12 self.__flag_mainLoop = True # mainLoop self.__flag_loading = False # load self.__flag_scanning = False # scan self.__flag_rssing = False # rss self.sysenc = sys.getfilesystemencoding() self.queue = NQueue() self.saveMovie = SaveMovie(1024)
class NicoMovieLoadMain(): def __init__(self, databasePath, systemDatabasePath, logging): """ databasePath: database file path systemDatabasePath: system database file path logging: log function """ self.databasePath = databasePath self.systemDatabasePath = systemDatabasePath #self.logging = logging self._wtime_load = 60 * 60 * 12 # wait times self._wtime_scan = 60 * 60 * 12 self._wtime_rss = 60 * 60 * 12 self.__flag_mainLoop = True # mainLoop self.__flag_loading = False # load self.__flag_scanning = False # scan self.__flag_rssing = False # rss self.sysenc = sys.getfilesystemencoding() self.queue = NQueue() self.saveMovie = SaveMovie(1024) def logging(self, text): print text def main(self): """ call each daemons """ db = Database(self.databasePath) db.ctTable() db.close() daemon = (self.daemonRss, self.daemonScan, self.daemonLoad, ) for func in daemon: th = threading.Thread(target=func) th.daemon = True th.start() time.sleep(3) def load(self, movieid): """ load movieid """ movieid = movieid self.logging("load: %s" % movieid) # 各データの取得 db = Database(self.databasePath) sdb = SystemDatabase(self.systemDatabasePath) nicoid = sdb.getNicoid() nicopw = sdb.getNicopw() savedir = sdb.getSavedir() sdb.close() api = NicovideoAPI(movie_id=movieid) title = api.get_movie_title() moviePath = api.save_movie(nicoid, nicopw, savedir) # 保存専用のクラスを定義する。一時停止可能なもの # 登録 db.setMoviePath(movieid, moviePath) db.setMovieState(movieid, 1) self.queue.done() db.close() return True def cancel(self): self.saveMovie.cancel() def find(self, text): """ find movieid/mylistid from text """ various = NVarious(None, self.logging) return various.find(text) def _scanning(self): """ scanning the database add to queue videos id unloaded should be called at regular intervals retunrn: added movieid num in queue """ num = 0 self.logging("scanning") db = Database(self.databasePath) for movieid in db.getMovieState0(): self.queue.add(movieid) self.logging("AddQueue: %s" % movieid) num += 1 db.close() return num def _rss(self): """ check new movieid from include mylistid register in database to the new movieid """ self.logging("rss") db = Database(self.databasePath) for mylistid in db.getMylistAll(): if db.getMylistRss(mylistid): self.logging("RSS: %s" % mylistid) hitNum = 0 apiMylist = NicovideoAPI.Nicovideo(mylistid=mylistid) for movieid in apiMylist.get_mylist_movies(): if not(movieid in db.getMylistHasMovieFromMylistId(mylistid)): self.logging("RSS: Hit: %s" % movieTitle) db.addMylistHasMovie(mylistid, movieid) self.register(movieid) db.setMovieTitle(movieid, movieTitle) hitNum += 1 self.logging("RSS: %s: %2dhit" % (mylistid, hitNum)) db.close() def register(self, mid): """ register in database mid if mid is already registered, it marks unload mid: mylistid or movieid return: bool """ db = Database(self.databasePath) if mid[0:2] == "sm": if db.extMovieidInTable(mid): db.setMovieState(mid, 0) else: apiMovie = NicovideoAPI(movie_id=mid) movieTitle = apiMovie.get_movie_title() db.addMovie(mid) db.setMovieTitle(mid, movieTitle) else: if db.extMylistInTable(mid): db.setMylistRss(mid, 1) else: api = NicovideoAPI(mylist_id=mid) mylistTitle = api.get_mylist_title().decode(self.sysenc) db.addMylist(mid) db.setMylistTitle(mylistTitle) db.close() def daemonLoad(self): """ daemon with self.load interval: interval function is called """ """ 一定時間(interval)ごとにself.load()を呼ぶ 重複呼び出しをしないようにフラグ管理 このフラグはself.doneで戻す """ while True: self.logging("daemon load") if self.__flag_loading == False: if not self.queue.empty(): self.__flag_loading = True mid = self.queue.get() print "mid:", mid self.load(mid) #self.load(self.queue.get()) self.queue.done() else: for i in xrange(self._wtime_load): time.sleep(1) # 中断処理 # def daemonScan(self): """ daemon with self.scanning interval: interval function is called """ while True: self.logging("daemon scan") if self.__flag_scanning == False: self.__flag_scanning = True self._scanning() for i in xrange(self._wtime_scan): time.sleep(1) # 中断処理 # def daemonRss(self): """ daemon with self.rss interval: interval function is called """ while True: self.logging("daemon rss") if self.__flag_rssing == False: self.__flag_rssing = True self._rss() for i in xrange(self._wtime_rss): time.sleep(1) # 中断処理 # # flag setter #def setFlagMain(self, flag): # self.__flag_ing = flag def setFlagLoad(self, flag): self.__flag_loading = flag def setFlagScan(self, flag): self.__flag_scanning = flag def setFlagRss(self, flag): self.__flag_rssing = flag # flag getter def getFlagLoad(self): self.__flag_loading def getFlagScan(self): self.__flag_scaning def getFlagRss(self): self.__flag_rssing # wait time setter def setWtimeLoad(self, interval): self._wtime_load = interval def setWtimeScan(self, interval): self._wtime_scan = interval def setWtimeRss(self, interval): self._wtime_rss = interval # wait time getter def getWtimeLoad(self): return self._wtime_load def getWtimeScan(self): return self._wtime_scan def getWtimeRss(self): return self._wtime_rss def getQueueObj(self): return self.queue