def run(self, cfg: dict): if cfg['all']: try: dc = get_data_client(cfg) except Exception: sys.stderr.write( "ERROR: invalid geektime account or password\n" "Use '{} login --help' for help.\n".format( sys.argv[0].split(os.path.sep)[-1])) return data = dc.get_course_list() cid_list = [] for c in data['1']['list']: if c['had_sub']: cid_list.append(c['id']) else: course_ids = cfg['course_ids'] cid_list = course_ids.split(',') for cid in cid_list: args = cfg.copy() args['course_id'] = int(cid) super().run(args)
def run(self, cfg: dict): cid_list = [] if cfg['all']: try: dc = get_data_client(cfg) except: sys.stderr.write( "ERROR: invalid geektime account or password\n" "Use '{} login --help' for help.\n".format( sys.argv[0].split(os.path.sep)[-1])) return data = dc.get_course_list() for c in data['1']['list'] + data['2']['list']: if c['had_sub'] and (c['update_frequency'] == '全集' or c['is_finish']): cid_list.append(c['id']) else: course_ids = cfg['course_ids'] cid_list.extend(course_ids.split(',')) for cid in cid_list: args = cfg.copy() args['course_id'] = int(cid) super().run(args) sys.stderr.write('\n')
def run(self, cfg: dict): try: dc = get_data_client(cfg) except: sys.stderr.write("ERROR: invalid geektime account or password\n" "Use '%s login --help' for help.\n" % sys.argv[0].split(os.path.sep)[-1]) return data = dc.get_course_list() result_str = '' for i in ['1', '2', '3', '4']: columns = data[i]['list'] result_str += {'1': '专栏', '2': '微课', '3': '视频', '4': '其他'}[i] + '\n' result_str += "\t{:<12}{}\t{}\t{:<10}\n".format('课程ID', '已订阅', '已完结', '课程标题') for c in columns: result_str += "\t{:<15}{}\t{}\t{:<10}\n".format( str(c['id']), '是' if c['had_sub'] else '否', '是' if c['is_finish'] else '否', c['column_title'], ) sys.stdout.write(result_str)
def run(self, cfg: dict): course_id = cfg['course_id'] if not course_id: sys.stderr.write("ERROR: couldn't find the target course id\n") return out_dir = os.path.join(cfg['output_folder'], 'mp3') if not os.path.isdir(out_dir): try: os.makedirs(out_dir) except OSError: sys.stderr.write( "ERROR: couldn't create the output folder {}\n".format( out_dir)) return url_only = cfg['url_only'] try: dc = get_data_client(cfg) except: sys.stderr.write("ERROR: invalid geektime account or password\n" "Use '%s <command> login --help' for help.\n" % sys.argv[0].split(os.path.sep)[-1]) return course_data = dc.get_course_intro(course_id) if int(course_data['column_type']) != 1: raise Exception('该课程不提供音频:%s' % course_data['column_title']) out_dir = os.path.join(out_dir, course_data['column_title']) if not os.path.isdir(out_dir): os.makedirs(out_dir) data = dc.get_course_content(course_id) if url_only: title = maker.format_file_name(course_data['column_title']) with open(os.path.join(out_dir, '%s.mp3.txt' % title), 'w') as f: # TODO alignment f.write('\n'.join([ "{}:\t\t{}".format( maker.format_file_name(post['article_title']), post['audio_download_url']) for post in data ])) sys.stdout.write('download {} mp3 url done\n'.format(title)) return dl = Downloader() for post in data: file_name = maker.format_file_name(post['article_title']) + '.mp3' if os.path.isfile(os.path.join(out_dir, file_name)): sys.stdout.write(file_name + ' exists\n') continue if post['audio_download_url']: dl.run(post['audio_download_url'], out_file=file_name, out_dir=out_dir) sys.stdout.write('download mp3 {} done: \n'.format(file_name))
def run(self, cfg: dict): try: dc = get_data_client(cfg) except Exception: sys.stderr.write( "ERROR: invalid geektime account or password\n" "Use '{} login --help' for help.\n".format( sys.argv[0].split(os.path.sep)[-1])) return data = dc.get_course_list() result_str = '' for i in ['1', '2', '3', '4']: columns = data[i]['list'] result_str += _course_map[i] + '\n' result_str += "\t{:<12}{}\t{}\t{:<10}\n".format( '课程ID', '已订阅', '已完结', '课程标题') for c in columns: is_finished = c['update_frequency'] == '全集' or c['is_finish'] result_str += "\t{:<15}{}\t{}\t{:<10}\n".format( str(c['id']), '是' if c['had_sub'] else '否', '是' if is_finished else '否', c['column_title'], ) sys.stdout.write(result_str)
def get_data_client(cfg: dict) -> DataClient: try: dc = get_data_client(cfg) return dc except Exception: raise ValueError("invalid geektime account or password\n" "Use '{} login --help' for help.\n".format( sys.argv[0].split(os.path.sep)[-1]))
def run(self, cfg: dict) -> None: # from ipdb import set_trace;set_trace() course_id = cfg['course_id'] if not course_id: sys.stderr.write("ERROR: couldn't find the target course id\n") return out_dir = os.path.join(cfg['output_folder'], 'ebook') if not os.path.isdir(out_dir): try: os.makedirs(out_dir) except OSError: sys.stderr.write("ERROR: couldn't create the output folder {}\n".format(out_dir)) return try: dc = get_data_client(cfg) except: sys.stderr.write("ERROR: invalid geektime account or password\n" "Use '%s <command> login --help' for help.\n" % sys.argv[0].split(os.path.sep)[-1]) return course_data = dc.get_course_intro(course_id, force=True) if int(course_data['column_type']) not in (1, 2): sys.stderr.write("ERROR: 该课程不提供文本:%s" % course_data['column_title']) return # data data = dc.get_course_content(course_id, force=cfg['force']) if cfg['enable_comments']: for post in data: post['article_content'] += self._render_comment_html(post['comments'], cfg['comments_count']) # source file course_data['column_title'] = maker.format_file_name(course_data['column_title']) self._render_column_source_files(course_data, data, out_dir, force=cfg['force']) # ebook if not cfg['source_only']: if course_data['update_frequency'] == '全集' and os.path.isfile(os.path.join(out_dir, self._title(course_data)) + '.mobi'): sys.stdout.write("{} exists\n".format(self._title(course_data))) else: make_mobi(source_dir=os.path.join(out_dir, course_data['column_title']), output_dir=out_dir) # push to kindle if cfg['push'] and not cfg['source_only']: fn = os.path.join(out_dir, "{}.mobi".format(self._title(course_data))) try: send_to_kindle(fn, cfg) sys.stdout.write("push to kindle done\n") except Exception as e: sys.stderr.write("ERROR: push to kindle failed, e={}\n".format(e))
def run(self, cfg: dict): course_id = cfg['course_id'] if not course_id: sys.stderr.write("ERROR: couldn't find the target course id\n") return out_dir = os.path.join(cfg['output_folder'], 'mp4') out_dir = os.path.expanduser(out_dir) if not os.path.isdir(out_dir): try: os.makedirs(out_dir) except OSError: sys.stderr.write( "ERROR: couldn't create the output folder {}\n".format( out_dir)) return url_only = cfg['url_only'] hd_only = cfg['hd_only'] workers = cfg['workers'] try: dc = get_data_client(cfg) except: sys.stderr.write("ERROR: invalid geektime account or password\n" "Use '%s login --help' for help.\n" % sys.argv[0].split(os.path.sep)[-1]) return course_data = dc.get_course_intro(course_id) if int(course_data['column_type']) != 3: raise Exception('该课程不是视频课程:%s' % course_data['column_title']) out_dir = os.path.join(out_dir, course_data['column_title']) if not os.path.isdir(out_dir): os.makedirs(out_dir) sys.stdout.write('doing ......\n') data = dc.get_course_content(course_id) if url_only: title = EbookRender.format_file_name(course_data['column_title']) with open(os.path.join(out_dir, '%s.mp4.txt' % title), 'w') as f: f.write('\n'.join([ "{}:\n{}\n{}\n\n".format( EbookRender.format_file_name(post['article_title']), post['video_media_map'].get('hd', {}).get('url'), post['video_media_map'].get('sd', {}).get('url')) for post in data ])) sys.stdout.write('download {} mp4 url done\n'.format(title)) return dl = Downloader() p = Pool(workers) start = time.time() for post in data: file_name = EbookRender.format_file_name( post['article_title']) + ('.hd' if hd_only else '.sd') if os.path.isfile(os.path.join(out_dir, file_name) + '.ts'): sys.stdout.write(file_name + ' exists\n') continue if hd_only: # some post has sd mp4 only url = post['video_media_map'].get( 'hd', {}).get('url') or post['video_media'].get( 'sd', {}).get('url') else: url = post['video_media_map'].get('sd', {}).get('url') p.apply_async(dl.run, (url, out_dir, file_name)) p.close() p.join() sys.stdout.write('download {} done, cost {}s\n'.format( course_data['column_title'], int(time.time() - start)))
def run(self, cfg: dict) -> None: course_id = cfg['course_id'] if not course_id: sys.stderr.write("ERROR: couldn't find the target course id\n") return out_dir = os.path.join(cfg['output_folder'], 'ebook') out_dir = os.path.expanduser(out_dir) if not os.path.isdir(out_dir): try: os.makedirs(out_dir) except OSError: sys.stderr.write( "ERROR: couldn't create the output folder {}\n".format( out_dir)) return try: dc = get_data_client(cfg) except Exception: sys.stderr.write("ERROR: invalid geektime account or password\n" "Use '{} login --help' for help.\n".format( sys.argv[0].split(os.path.sep)[-1])) return course_data = dc.get_course_intro(course_id, force=True) if int(course_data['column_type']) not in (1, 2): sys.stderr.write("ERROR: 该课程不提供文本:{}".format( course_data['column_title'])) return # data sys.stdout.write('doing ......\n') data = dc.get_course_content(course_id, force=cfg['force']) if cfg['enable_comments']: for post in data: post['article_content'] += self._render_comment_html( post['comments'], cfg['comments_count']) # source file course_data['column_title'] = Render.format_file_name( course_data['column_title']) self._render_source_files(course_data, data, out_dir, force=cfg['force']) # ebook ebook_name = self._title(course_data) if not cfg['source_only']: fn = os.path.join(out_dir, ebook_name) + '.mobi' if course_data['is_finish'] and os.path.isfile(fn): sys.stdout.write("{} exists\n".format(ebook_name)) else: src_dir = os.path.join(out_dir, course_data['column_title']) make_mobi(source_dir=src_dir, output_dir=out_dir) # push to kindle if cfg['push'] and not cfg['source_only']: fn = os.path.join(out_dir, "{}.mobi".format(ebook_name)) try: send_to_kindle(fn, cfg) sys.stdout.write("push to kindle done\n") except Exception as e: sys.stderr.write( "ERROR: push to kindle failed, e={}\n".format(e))