def _extract_large_course_content(self, url): url = url.replace("10000", "50") if url.endswith("10000") else url try: data = self._session._get(url).json() except conn_error as error: logger.error(msg=f"Udemy Says: Connection error, {error}") time.sleep(0.8) sys.exit(0) else: _next = data.get("next") while _next: logger.progress(msg="Downloading course information .. ") try: resp = self._session._get(_next).json() except conn_error as error: logger.error(msg=f"Udemy Says: Connection error, {error}") time.sleep(0.8) sys.exit(0) else: _next = resp.get("next") results = resp.get("results") if results and isinstance(results, list): for d in resp["results"]: data["results"].append(d) return data
def _my_courses(self, portal_name): results = [] try: url = MY_COURSES_URL.format(portal_name=portal_name) webpage = self._session._get(url).json() except conn_error as error: logger.error(msg=f"Udemy Says: Connection error, {error}") time.sleep(0.8) sys.exit(0) except (ValueError, Exception) as error: logger.error(msg=f"Udemy Says: {error}") time.sleep(0.8) sys.exit(0) else: results = webpage.get("results", []) return results
def _extract_subscribed_courses(self): def clean_urls(courses): _urls = [] courses = [ dict(tupleized) for tupleized in set( tuple(item.items()) for item in courses) ] for entry in courses: logger.progress( msg="Fetching all enrolled course(s) url(s).. ") url = entry.get("url") if not url: continue url = f"https://www.udemy.com{url}" _urls.append(url) _urls = list(set(_urls)) return _urls _temp = [] try: response = self._session._get(SUBSCRIBED_COURSES).json() except conn_error as error: logger.error(msg=f"Udemy Says: Connection error, {error}") time.sleep(0.8) sys.exit(0) except (ValueError, Exception) as error: logger.error(msg=f"Udemy Says: {error}") time.sleep(0.8) sys.exit(0) else: results = response.get("results", []) _temp.extend(results) _next = response.get("next") logger.progress(msg="Fetching all enrolled course(s) url(s).. ") while _next: logger.progress( msg="Fetching all enrolled course(s) url(s).. ") try: resp = self._session._get(_next) resp.raise_for_status() resp = resp.json() except conn_error as error: logger.error(msg=f"Udemy Says: Connection error, {error}") time.sleep(0.8) sys.exit(0) except Exception as error: logger.error(msg=f"Udemy Says: error, {error}") time.sleep(0.8) sys.exit(0) else: _next = resp.get("next") results = resp.get("results", []) _temp.extend(results) if _temp: _temp = clean_urls(_temp) return _temp
def _fetch_course(self): auth = {} if not self._cookies: auth = self._login(username=self._username, password=self._password) if not auth and self._cookies: auth = self._login(cookies=self._cookies) if auth.get("login") == "successful": logger.info(msg="Logged in successfully.", new_line=True) logger.info(msg="Fetching all enrolled course(s) url(s)..") self._courses = self._extract_subscribed_courses() time.sleep(1) logger.success(msg="Fetching all enrolled course(s) url(s).. ") self._logout() if auth.get("login") == "failed": logger.error(msg="Failed to login ..\n") sys.exit(0)
def _extract_course_json(self, url, course_id, portal_name): self._session._headers.update({"Referer": url}) url = COURSE_URL.format(portal_name=portal_name, course_id=course_id) try: resp = self._session._get(url) if resp.status_code in [502, 503]: resp = self._extract_large_course_content(url=url) else: resp = resp.json() except conn_error as error: logger.error(msg=f"Udemy Says: Connection error, {error}") time.sleep(0.8) sys.exit(0) except (ValueError, Exception): resp = self._extract_large_course_content(url=url) return resp else: return resp
def _fetch_course(self): if self._have_basic: return auth = {} if not self._cookies: auth = self._login( username=self._username, password=self._password, cache_session=self._cache_session, ) if not auth and self._cookies: auth = self._login(cookies=self._cookies, cache_session=self._cache_session) if auth.get("login") == "successful": logger.info(msg="Logged in successfully.", new_line=True) logger.info(msg="Downloading course information ..") self._info = self._real_extract( self._url, skip_hls_stream=self._skip_hls_stream) time.sleep(1) logger.success(msg="Downloaded course information .. ") access_token = self._info["access_token"] self._id = self._info["course_id"] self._title = self._info["course_title"] self._chapters_count = self._info["total_chapters"] self._total_lectures = self._info["total_lectures"] self._chapters = [ InternUdemyChapter(z, access_token=access_token) for z in self._info["chapters"] ] logger.info( msg="Trying to logout now...", new_line=True, ) if not self._cookies: self._logout() logger.info( msg="Logged out successfully.", new_line=True, ) self._have_basic = True if auth.get("login") == "failed": logger.error(msg="Failed to login ..\n") sys.exit(0)
def _subscribed_collection_courses(self, portal_name): url = COLLECTION_URL.format(portal_name=portal_name) courses_lists = [] try: webpage = self._session._get(url).json() except conn_error as error: logger.error(msg=f"Udemy Says: Connection error, {error}") time.sleep(0.8) sys.exit(0) except (ValueError, Exception) as error: logger.error(msg=f"Udemy Says: {error}") time.sleep(0.8) sys.exit(0) else: results = webpage.get("results", []) if results: [ courses_lists.extend(courses.get("courses", [])) for courses in results if courses.get("courses", []) ] return courses_lists
def _subscribed_courses(self, portal_name, course_name): results = [] self._session._headers.update({ "Host": "{portal_name}.udemy.com".format(portal_name=portal_name), "Referer": "https://{portal_name}.udemy.com/home/my-courses/search/?q={course_name}" .format(portal_name=portal_name, course_name=course_name), }) url = COURSE_SEARCH.format(portal_name=portal_name, course_name=course_name) try: webpage = self._session._get(url).json() except conn_error as error: logger.error(msg=f"Udemy Says: Connection error, {error}") time.sleep(0.8) sys.exit(0) except (ValueError, Exception) as error: logger.error(msg=f"Udemy Says: {error} on {url}") time.sleep(0.8) sys.exit(0) else: results = webpage.get("results", []) return results
def _spinner(self, text): spin = self.SPINNER.__next__() sys.stdout.write(text + spin) sys.stdout.flush() time.sleep(0.02)