Пример #1
0
    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)
Пример #2
0
    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')
Пример #3
0
    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)
Пример #4
0
    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))
Пример #5
0
    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)
Пример #6
0
 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]))
Пример #7
0
    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))
Пример #8
0
    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)))
Пример #9
0
    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))