示例#1
0
    def fetch_stream_url(self, stream_page):
        selectors = self.selectors
        driver = self.driver

        driver.get(stream_page)
        self._execute_js_scripts()

        # Choose yourupload as streaming server
        yourupload_button = driver.find_element_by_css_selector(
            selectors.YOURUPLOAD)
        yourupload_button.click()
        yourupload_button.click()

        player = driver.find_element_by_css_selector(selectors.PLAYER)

        res, calls, success = call_till_true(is_iframe_loaded,
                                             self.episode_fetch_timeout,
                                             driver)

        printd("outside wait loop ;", "success:", success, "calls:", calls)

        # No need to click. YourUpload initiates the request during page load.
        # video = player.find_element_by_css_selector("video")
        # video.click()

        return self.search_url_in_perflogs(self.regex_pattern_objects)
示例#2
0
    def fetch_stream_url(self, stream_page):
        selectors = self.selectors
        driver = self.driver

        driver.get(stream_page)
        self._execute_js_scripts()

        # Choose mp4upload as streaming server
        # if self.selectors != KickassAnimeSelectors:
        #     # Kickassanime uses MP4Upload by default
        #     # print("clicking")

        mp4upload_button = driver.find_element_by_css_selector(
            selectors.MP4UPLOAD)
        mp4upload_button.click()
        mp4upload_button.click()

        player = driver.find_element_by_css_selector(selectors.PLAYER)

        # if self.selectors != KickassAnimeSelectors:
        #     res, calls, success = call_till_true(is_iframe_loaded, self.episode_fetch_timeout, driver)
        # else:
        #     res, calls, success = call_till_true(is_document_loaded, self.episode_fetch_timeout, driver)

        res, calls, success = call_till_true(is_iframe_loaded,
                                             self.episode_fetch_timeout,
                                             driver)
        printd("outside wait loop ;", "success:", success, "calls:", calls)

        iframe = player.find_element_by_css_selector("iframe")
        iframe.click()

        return self.search_url_in_perflogs(self.regex_pattern_objects)
示例#3
0
    def fetch_stream_url(self, stream_page):
        selectors = self.selectors
        driver = self.driver

        driver.get(stream_page)
        self._execute_js_scripts()

        # Choose openupload as streaming server
        # GoGoAnime has 2 open upload buttons. First one's broken.
        openupload_buttons = driver.find_elements_by_css_selector(
            selectors.OPENUPLOAD)
        openupload_button = openupload_buttons[-1]

        if selectors == GoGoAnimeSelectors:
            openupload_button.click()
        else:
            real_btn = openupload_button.find_element_by_tag_name("a")
            time.sleep(3)
            real_btn.click()

        player = driver.find_element_by_css_selector(selectors.PLAYER)

        res, calls, success = call_till_true(is_iframe_loaded,
                                             self.episode_fetch_timeout,
                                             driver)
        printd("outside wait loop ;", "success:", success, "calls:", calls)

        frame = player.find_element_by_tag_name("iframe")

        if selectors == GoGoAnimeSelectors:
            frame.click()  # First click opens a pop up
            time.sleep(2)
            frame.click()  # Second click triggers stream
        else:
            # Kickassanime is weird. They have a fake player on top of the real one.
            time.sleep(2)
            frame.click()
            time.sleep(7)
            frame.click()
            time.sleep(3)

        stream_url = self.search_url_in_perflogs(self.regex_pattern_objects)

        if not stream_url:
            player.click()
            time.sleep(2)
            stream_url = self.search_url_in_perflogs(
                self.regex_pattern_objects)

        return stream_url
示例#4
0
    def fetch_stream_url(self, stream_page):
        selectors = self.selectors
        driver = self.driver

        driver.get(stream_page)
        self._execute_js_scripts()

        # Choose openupload as streaming server
        # GoGoAnime has 2 open upload buttons. First one's broken.
        openupload_buttons = driver.find_elements_by_css_selector(selectors.OPENUPLOAD)
        openupload_button = openupload_buttons[1] if len(openupload_buttons) > 1 else openupload_buttons[0]
        openupload_button.click()
        openupload_button.click() # First click doesn't register in some cases

        player = driver.find_element_by_css_selector(selectors.PLAYER)
        
        '''
        while True:
            try:
                status_raw = driver.find_element_by_css_selector(LOAD_STATUS_SELECTOR).text
                status = json.loads(status_raw)
                print("in loop")
                if status["iframe_loaded"]:
                    print("iframe loaded")
                    break
            except NoSuchElementException as err:
                print("not there yet " + err.msg)
        '''

        res, calls, success = call_till_true(is_iframe_loaded, self.episode_fetch_timeout, driver)

        printd("outside wait loop ;", "success:", success, "calls:", calls)

        frame = player.find_element_by_tag_name("iframe")

        # TODO: Find alternative to use time.sleep()

        # First click opens a pop up
        frame.click()
        # [BAD] Waiting to make sure media player is accessible in the iframe 
        # (because I have a wooden PC from the stone age -_-)
        time.sleep(2) 

        # Second click triggers stream
        frame.click()
        # time.sleep(3) # [BAD] Waiting to make sure HTTP request to the stream file is made

        return self.search_url_in_perflogs(self.regex_pattern_objects)
示例#5
0
    def fetch_episode_list(self):
        # -> { 'Episode 1': 'https://www.kickassanime.ru/anime/gintama/episode-1', ... }
        if self.episodes_dict:
            return self.episodes_dict

        printd("fetching episode list")
        printing.fetching_list(self.anime_url)
        driver = self.driver

        # Execute JS to load the entire episode list
        self._execute_js_scripts()

        ep_list_container = driver.find_element_by_css_selector(
            GoGoAnimeSelectors.EPISODE_LIST)

        def fetch_ep_list(container):
            return container.find_elements_by_css_selector(
                GoGoAnimeSelectors.EPISODE)

        # Sometimes the episode list takes a while to load and fetch_ep_list gets 0 episodes
        # call_till_true will keep trying for n seconds till we get >0 episodes
        ep_list, calls, success = call_till_true(
            fetch_ep_list, TimeoutConfig.FETCHING_EPISODE_LIST,
            ep_list_container)

        if not success:
            # TODO: Change error raised
            raise ValueError("Failed to fetch episode list")

        printd("calls", calls)
        # print(ep_list_container.text)
        # print(len(ep_list))

        ep_dict = {}

        for ep in ep_list:
            if ep.text:
                episode_name = re.search(r"EP ([\d\-\.]+)",
                                         ep.text).group().replace(
                                             "EP", "Episode")
                ep_dict[episode_name] = ep.get_attribute("href")
        # print(ep_dict)
        return ep_dict