def main(): colorama.init() print("Thank you for using canvas_grab!") print( f"You are using version {VERSION}. If you have any questions, please file an issue at {Fore.BLUE}https://github.com/skyzh/canvas_grab/issues{Style.RESET_ALL}" ) print( f"You may review {Fore.GREEN}README(_zh-hans).md{Style.RESET_ALL} and {Fore.GREEN}LICENSE{Style.RESET_ALL} shipped with this release" ) config.load_config() if config.ENABLE_VIDEO: print( f"Note: You've enabled video download. You should install the required tools yourself." ) print( f" This is an experimental functionality and takes up large amount of bandwidth. {Fore.RED}Use at your own risk.{Style.RESET_ALL}" ) canvas = Canvas(config.API_URL, config.API_KEY) try: print(f'{Fore.BLUE}Logging in...{Style.RESET_ALL}') print( f"{Fore.GREEN}Logged in to {config.API_URL} as {canvas.get_current_user()}{Style.RESET_ALL}" ) except canvasapi.exceptions.InvalidAccessToken: print( f"{Fore.RED}Invalid access token, please check your config.API_KEY in config file" ) if is_windows(): # for windows double-click user input() exit() try: global checkpoint checkpoint = Checkpoint(config.CHECKPOINT_FILE) checkpoint.load() except FileNotFoundError: print(f"{Fore.RED}No checkpoint found{Style.RESET_ALL}") courses = [ course for course in canvas.get_courses() if hasattr(course, "name") ] if config.WHITELIST_CANVAS_ID: print(f"{Fore.BLUE}Whilelist mode enabled{Style.RESET_ALL}") courses = [ course for course in courses if course.id in config.WHITELIST_CANVAS_ID ] try: for course in courses: if course.start_at: delta = -(datetime.strptime( course.start_at, r'%Y-%m-%dT%H:%M:%S%z').replace( tzinfo=None) - datetime.now()).days else: delta = 0 if course.id in config.IGNORED_CANVAS_ID: print( f"{Fore.CYAN}Explicitly Ignored Course: {course.course_code}{Style.RESET_ALL}" ) elif config.RETAIN_COURSE_DAYS != 0 and delta > config.RETAIN_COURSE_DAYS: print( f"{Fore.CYAN}Outdated Course: {course.course_code}{Style.RESET_ALL}" ) else: try: process_course(course) except KeyboardInterrupt: raise except canvasapi.exceptions.Unauthorized as e: print( f"{Fore.RED}An error occoured when processing this course (unauthorized): {e}{Style.RESET_ALL}" ) except canvasapi.exceptions.ResourceDoesNotExist as e: print( f"{Fore.RED}An error occoured when processing this course (resourse not exist): {e}{Style.RESET_ALL}" ) if config.SCAN_STALE_FILE: scan_stale_files(courses) except KeyboardInterrupt: print( f"{Fore.RED}Terminated due to keyboard interrupt.{Style.RESET_ALL}" ) checkpoint.dump() if new_files_list: print( f"{Fore.GREEN}{len(new_files_list)} new or updated files:{Style.RESET_ALL}" ) for f in new_files_list: print(f" {f}") if updated_files_list: print( f"{Fore.GREEN}{len(updated_files_list)} files have a more recent version on Canvas:{Style.RESET_ALL}" ) for f in updated_files_list: print(f" {f}") if failure_file_list: print( f"{Fore.YELLOW}{len(failure_file_list)} files are not downloaded:{Style.RESET_ALL}" ) for f in failure_file_list: print(f" {f}") if not new_files_list and not updated_files_list: print("All files up to date") if config.ENABLE_VIDEO: print( f"{Fore.GREEN}{len(ffmpeg_commands)} videos resolved{Style.RESET_ALL}" ) print( f"Please run the automatically-generated script {Fore.BLUE}download_video.(sh/ps1){Style.RESET_ALL} to download all videos." ) with open("download_video.sh", 'w') as file: file.write("\n".join(ffmpeg_commands)) with open("download_video.ps1", 'w') as file: file.write("\n".join(ffmpeg_commands)) if config.ALLOW_VERSION_CHECK: check_latest_version() print(f"{Fore.GREEN}Done.{Style.RESET_ALL}") if is_windows(): # for windows double-click user input()