Exemplo n.º 1
0
    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)
Exemplo n.º 2
0
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