コード例 #1
0
ファイル: video.py プロジェクト: JLHasson/pg2
    def __init__(self):

        self.queue = self.VideoQueue()

        self.currentVideo = None

        self.ip_list = set()
        self.skip_list = set()
        self.skip_thresh = 0.5
        self.start_time = time.time()
        self.last_was_skipped = False
        self.tweetBot = TweetBot()
コード例 #2
0
ファイル: video.py プロジェクト: JLHasson/pg2
class VideoTracker:

    __object = None

    @staticmethod
    def getObject():
        if not VideoTracker.__object:
            VideoTracker.__object = VideoTracker()
        return VideoTracker.__object

    def __init__(self):

        self.queue = self.VideoQueue()

        self.currentVideo = None

        self.ip_list = set()
        self.skip_list = set()
        self.skip_thresh = 0.5
        self.start_time = time.time()
        self.last_was_skipped = False
        self.tweetBot = TweetBot()

    def get_video(self, ip):
        if not self.currentVideo:
            self.next_video()

        if self.running_time() >= self.currentVideo[1]:
            self.next_video()
            self.last_was_skipped = False

        self.ip_list.add(ip)
        logging.debug("Users: " + str(len(self.ip_list)) + ", Skips: " + str(len(self.skip_list)))
        j = {
            "id": self.currentVideo[0],
            "time": self.running_time(),
            "users": len(self.ip_list),
            "skips": self.skip_progress(),
            "last_skipped": self.last_was_skipped
        }
        return json.dumps(j)

    def reg_skip(self, ip):
        self.skip_list.add(ip)
        logging.debug("Skips " + str(len(self.skip_list)))
        logging.debug("Needed " + str(self.skip_thresh * len(self.ip_list)))

        if len(self.skip_list) >= self.skip_thresh * len(self.ip_list):
            self.next_video()
            self.last_was_skipped = True

    def skip_progress(self):
        skips = len(self.skip_list)
        needed = self.skip_thresh * len(self.ip_list)
        return int(100 * skips/needed)

    def next_video(self):
        if self.currentVideo:
            self.create_db_entry()
            logging.info("Video " + self.currentVideo[0] + " watched for " + str(self.running_time()) + "/" + str(self.currentVideo[1]) + "s")
            logging.debug("Watched by " + str(len(self.ip_list)) + ": " + str(self.ip_list))
            logging.debug("Skipped by " + str(len(self.skip_list)) + ": " + str(self.skip_list))
        self.skip_list = set()
        self.ip_list = set()
        self.currentVideo = self.queue.pop()
        logging.info("Now showing " + str(self.currentVideo))
        self.start_time = time.time()

        # tweet(ytid, title, viewers, skips, query)
        self.tweetBot.tweet(self.currentVideo[0], self.currentVideo[2], len(self.ip_list), len(self.skip_list), self.currentVideo[3])

    def running_time(self):
        return int(time.time() - self.start_time)

    def create_db_entry(self):
        v = Video(self.currentVideo[0])
        v.timestamp = datetime.datetime.fromtimestamp(self.start_time)
        v.length = self.currentVideo[1]
        v.watched = int(time.time() - self.start_time)
        if v.watched > v.length:
            v.watched = v.length
        v.viewers = len(self.ip_list)
        v.skips = len(self.skip_list)
        v.title = self.currentVideo[2]
        v.query = self.currentVideo[3]
        db.session.add(v)
        db.session.commit()

    def unregister(self, ip):
        self.skip_list.discard(ip)
        self.ip_list.discard(ip)

        if len(self.skip_list) >= self.skip_thresh * len(self.ip_list):
            self.next_video()

    class VideoQueue:

        def __init__(self):
            self.queue = []
            self.lower_thresh = 10
            self.upper_thresh = 20
            self.batch_size = 25

            self.word_list = []
            self.load_word_list()

            t = Thread(target=self.refill)
            t.setDaemon(True)
            t.start()

        def pop(self):
            ret = self.queue.pop(0)
            if len(self.queue) < self.lower_thresh:
                t = Thread(target=self.refill)
                t.setDaemon(True)
                t.start()
            return ret

        def refill(self):
            while len(self.queue) < self.upper_thresh:
                q = self.get_search_term()
                vid = youtube_search(q, self.batch_size)
                if not vid:
                    continue
                vid = (vid[0], vid[1], vid[2], q)
                logging.debug("Added vid: " + str(vid))
                self.queue.append(vid)

        def load_word_list(self):
            f = open("app/api/words.txt", "r")
            for line in f:
                self.word_list.append(line.strip())
            f.close()

        def get_search_term(self):
            term = ""
            cnt = random.randint(1, 3)
            for i in range(cnt):
                term += self.word_list[random.randint(0, len(self.word_list)-1)] + " "
            return term.strip()